国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java常用工具類(lèi)總結

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:三3三 欄目: 開(kāi)發(fā)技術(shù)

目錄

一、線(xiàn)程協(xié)作、控制并發(fā)流程的工具類(lèi)

 什么是控制并發(fā)流程?

控制并發(fā)流程的工具類(lèi),作用就是幫助我們程序員更容易得讓線(xiàn)程之間合作讓線(xiàn)程之間相互配合,來(lái)滿(mǎn)足業(yè)務(wù)邏輯比如讓線(xiàn)程A等待線(xiàn)程B執行完畢后再執行等合作策略

二、CountDownLatch倒計時(shí)門(mén)閂

倒數門(mén):

例子:購物拼團;大巴,人滿(mǎn)才會(huì )發(fā)車(chē)

流程:倒數結束之前,一直處于等待狀態(tài),直到倒計時(shí)結束,此線(xiàn)程才繼續工作。
開(kāi)始 -> 進(jìn)入等待 -> 倒數結束 -> 繼續工作

類(lèi)的主要方法介紹:

CountDownLatch(int count):僅有一個(gè)構造函數,參數count為需要倒數的數值

await():調用await()方法的線(xiàn)程會(huì )被掛起,他會(huì )等待直到count值為0才繼續執行。
countDown():將count值減1,直到為0時(shí),等待的線(xiàn)程才會(huì )被喚起。

圖解await和countDown方法:

構造方式代碼:

注意點(diǎn):

擴展用法:多個(gè)線(xiàn)程等多個(gè)線(xiàn)程執行完成后,再同時(shí)執行

CountDownLatch是不能夠重用的,如果需要重新計數,可以考慮使用CyclicBarrier或者創(chuàng )建新的CountDownLatch實(shí)例

三、Semaphore信號量

Semaphore可以用來(lái)限制或管理數量有限的資源的使用情況信號量的作用是維護一個(gè)許可證的計數,線(xiàn)程可以獲取許可證,那信號量剩余的許可證就加一,當信號量所擁有的許可證數量為0,name下一個(gè)還想要獲取許可證的線(xiàn)程,就需要等待,知道另外別的線(xiàn)程釋放了許可證

信號量用法:

初始化Semaphore并指定許可證數量

在需要被線(xiàn)程在的代碼前加acquire()或者acquireUninterruptibly()方法

在任務(wù)執行結束后,調用release()來(lái)釋放許可證

信號量主要方法介紹:

  •  acquire():獲取許可證,可以中斷
  • acquireUninterruptibly():獲取許可證,不能中斷
  • release():歸還許可證(一定不能忘記,線(xiàn)程不會(huì )自動(dòng)歸還)new Semaphore(int permits, boolean fair):這里可以設置是否使用公平策略,如果傳入為true,nameSemaphore會(huì )把之前等待的線(xiàn)程放到FIFO的隊列里,以便于當有了新的許可證,可以分發(fā)給之前等了最長(cháng)時(shí)間的線(xiàn)程
  • tryAcquire():看看現在有沒(méi)有空閑的許可證,如果有就獲取,如果沒(méi)有就做別的事。
  • tryAcquire(timeout):和tryAcquire一樣,但是多了一個(gè)超時(shí)時(shí)間,比如在3秒內獲取不到許可證,就做別的事。

構造方式代碼:

注意點(diǎn):

獲取和釋放的許可證數量必須一致否則比如每次都獲取2個(gè),但是只釋放1個(gè),隨著(zhù)時(shí)間的推移,到最后許可證數量不夠用,會(huì )導致程序科四。

注意在初始化Semaphore的時(shí)候設置公平性,一般設置為true更合理。

并不是必須由獲取許可證的線(xiàn)程釋放那個(gè)許可證,事實(shí)上,獲取和釋放許可證對線(xiàn)程并無(wú)要求,也許是A獲取了,然后由B釋放,只要邏輯合理即可

信號量的作用,處理控制臨界區最多同時(shí)有N個(gè)線(xiàn)程訪(fǎng)問(wèn)外,另一個(gè)作用是可以實(shí)現“條件等待”,例如線(xiàn)程1需要線(xiàn)程2完成準備工作后才能開(kāi)始執行,那么就線(xiàn)程1acquire,而線(xiàn)程2執行之后release,這樣的話(huà),相當于是輕量級的CountDownLatch

四、Condition接口(又稱(chēng)條件對象)

Condition作用

  • 當線(xiàn)程1需要等待某個(gè)條件的時(shí)候,他就去執行condition.await()方法,一旦執行了await()方法,線(xiàn)程就進(jìn)入阻塞狀態(tài)。
  • 然后通常會(huì )有另外一個(gè)線(xiàn)程,假設是線(xiàn)程2,去執行對應的條件,知道這個(gè)條件達成的時(shí)候,線(xiàn)程2就會(huì )去執行condition.signal()方法,這時(shí)JVM就會(huì )從被阻塞的線(xiàn)程里找到那些等待該condition的線(xiàn)程,當線(xiàn)程1就會(huì )收到可執行信息的時(shí)候,他的線(xiàn)程狀態(tài)就會(huì )變成Runnable可執行狀態(tài)

 signalAll()和signal()區別

  • signalAll():會(huì )喚起所有正在等待的線(xiàn)程
  • signal:只會(huì )喚起那個(gè)等待時(shí)間最長(cháng)的線(xiàn)程

構造方式代碼:

注意點(diǎn):

  • 實(shí)際上,如果說(shuō)lock用來(lái)代替synchronized,那么Condition就是用來(lái)代替相對應的Object.wait/notify的,所以在用法和性質(zhì)上,幾乎都一樣
  • await方法會(huì )自動(dòng)釋放持有的lock鎖,和Object.wait一樣,不需要自己手動(dòng)釋放鎖
  • 調用await的時(shí)候,必須持有鎖,否則會(huì )拋出異常

CyclicBarrier循環(huán)柵欄

  • CyclicBarrier循環(huán)柵欄和CountDownLatch很類(lèi)似,都能阻塞一組線(xiàn)程
  • 當有大量線(xiàn)程相互配合,分別計算不同任務(wù),并且需要最后統一匯總的時(shí)候,我們可以使用CyclicBarrier。CyclicBarrier可以構造一個(gè)集結點(diǎn),當某一個(gè)線(xiàn)程執行完畢,他就會(huì )到集結點(diǎn)等待,直到所有線(xiàn)程都到了集結點(diǎn),那么該柵欄就會(huì )被撤銷(xiāo),所有線(xiàn)程再統一出發(fā),繼續執行剩下的任務(wù)。

代碼演示:

五、CyclicBarrier和CountDownLatch的區別

  • 作用不同:CyclicBarrier要等固定數量的線(xiàn)程都達到了柵欄位置才能繼續執行,兒CountDownLatch只需要等待數字到0,也就是說(shuō),CountDownLatch用于時(shí)間,但是CyclicBarrier是用于線(xiàn)程的
  • 可重用性不同:CountDownLatch在倒數到0并觸發(fā)門(mén)閂打開(kāi)后,就不能再次使用了,除非新建新的實(shí)例;而CyclicBarrier可以重復使用。

到此這篇關(guān)于Java常用工具類(lèi)總結的文章就介紹到這了,更多相關(guān)Java工具類(lèi)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

国产黄三级高清在线观看播放| 在线观看欧美一区二区三区| 亚洲欧洲无码AV不卡在线| 老司机午夜精品视频资源| 999国产精品999久久久久久| 少妇与黑人一二三区无码|