Java常用工具類總結
一、線程協作、控制並發流程的工具類
什麼是控制並發流程?
控制並發流程的工具類,作用就是幫助我們程序員更容易得讓線程之間合作讓線程之間相互配合,來滿足業務邏輯比如讓線程A等待線程B執行完畢後再執行等合作策略
二、CountDownLatch倒計時門閂
倒數門:
例子:購物拼團;大巴,人滿才會發車
流程:倒數結束之前,一直處於等待狀態,直到倒計時結束,此線程才繼續工作。
開始 -> 進入等待 -> 倒數結束 -> 繼續工作
類的主要方法介紹:
CountDownLatch(int count):僅有一個構造函數,參數count為需要倒數的數值
await():調用await()方法的線程會被掛起,他會等待直到count值為0才繼續執行。
countDown():將count值減1,直到為0時,等待的線程才會被喚起。
圖解await和countDown方法:
構造方式代碼:
註意點:
擴展用法:多個線程等多個線程執行完成後,再同時執行
CountDownLatch是不能夠重用的,如果需要重新計數,可以考慮使用CyclicBarrier或者創建新的CountDownLatch實例
三、Semaphore信號量
Semaphore可以用來限制或管理數量有限的資源的使用情況信號量的作用是維護一個許可證的計數,線程可以獲取許可證,那信號量剩餘的許可證就加一,當信號量所擁有的許可證數量為0,name下一個還想要獲取許可證的線程,就需要等待,知道另外別的線程釋放瞭許可證
信號量用法:
初始化Semaphore並指定許可證數量
在需要被線程在的代碼前加acquire()或者acquireUninterruptibly()方法
在任務執行結束後,調用release()來釋放許可證
信號量主要方法介紹:
- acquire():獲取許可證,可以中斷
- acquireUninterruptibly():獲取許可證,不能中斷
- release():歸還許可證(一定不能忘記,線程不會自動歸還)new Semaphore(int permits, boolean fair):這裡可以設置是否使用公平策略,如果傳入為true,nameSemaphore會把之前等待的線程放到FIFO的隊列裡,以便於當有瞭新的許可證,可以分發給之前等瞭最長時間的線程
- tryAcquire():看看現在有沒有空閑的許可證,如果有就獲取,如果沒有就做別的事。
- tryAcquire(timeout):和tryAcquire一樣,但是多瞭一個超時時間,比如在3秒內獲取不到許可證,就做別的事。
構造方式代碼:
註意點:
獲取和釋放的許可證數量必須一致否則比如每次都獲取2個,但是隻釋放1個,隨著時間的推移,到最後許可證數量不夠用,會導致程序科四。
註意在初始化Semaphore的時候設置公平性,一般設置為true更合理。
並不是必須由獲取許可證的線程釋放那個許可證,事實上,獲取和釋放許可證對線程並無要求,也許是A獲取瞭,然後由B釋放,隻要邏輯合理即可
信號量的作用,處理控制臨界區最多同時有N個線程訪問外,另一個作用是可以實現“條件等待”,例如線程1需要線程2完成準備工作後才能開始執行,那麼就線程1acquire,而線程2執行之後release,這樣的話,相當於是輕量級的CountDownLatch
四、Condition接口(又稱條件對象)
Condition作用
- 當線程1需要等待某個條件的時候,他就去執行condition.await()方法,一旦執行瞭await()方法,線程就進入阻塞狀態。
- 然後通常會有另外一個線程,假設是線程2,去執行對應的條件,知道這個條件達成的時候,線程2就會去執行condition.signal()方法,這時JVM就會從被阻塞的線程裡找到那些等待該condition的線程,當線程1就會收到可執行信息的時候,他的線程狀態就會變成Runnable可執行狀態
signalAll()和signal()區別
- signalAll():會喚起所有正在等待的線程
- signal:隻會喚起那個等待時間最長的線程
構造方式代碼:
註意點:
- 實際上,如果說lock用來代替synchronized,那麼Condition就是用來代替相對應的Object.wait/notify的,所以在用法和性質上,幾乎都一樣
- await方法會自動釋放持有的lock鎖,和Object.wait一樣,不需要自己手動釋放鎖
- 調用await的時候,必須持有鎖,否則會拋出異常
CyclicBarrier循環柵欄
- CyclicBarrier循環柵欄和CountDownLatch很類似,都能阻塞一組線程
- 當有大量線程相互配合,分別計算不同任務,並且需要最後統一匯總的時候,我們可以使用CyclicBarrier。CyclicBarrier可以構造一個集結點,當某一個線程執行完畢,他就會到集結點等待,直到所有線程都到瞭集結點,那麼該柵欄就會被撤銷,所有線程再統一出發,繼續執行剩下的任務。
代碼演示:
五、CyclicBarrier和CountDownLatch的區別
- 作用不同:CyclicBarrier要等固定數量的線程都達到瞭柵欄位置才能繼續執行,兒CountDownLatch隻需要等待數字到0,也就是說,CountDownLatch用於時間,但是CyclicBarrier是用於線程的
- 可重用性不同:CountDownLatch在倒數到0並觸發門閂打開後,就不能再次使用瞭,除非新建新的實例;而CyclicBarrier可以重復使用。
到此這篇關於Java常用工具類總結的文章就介紹到這瞭,更多相關Java工具類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java並發編程之常用的輔助類詳解
- 淺談Java並發之同步器設計
- Java中的Semaphore如何使用
- java並發包中CountDownLatch和線程池的使用詳解
- Java多線程同步工具類CyclicBarrier的使用