java併發工具類
1、CountDownLatch :能夠使一個或多個線程等待其他線程完成各自的工作後再執行
2、CyclicBarrier : 讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個線程到達屏障時,屏障纔會開門,所有被屏障攔截的線程纔會繼續運行。
3、Semaphore : 用來控制同時訪問特定資源的線程數量,它通過協調各個線程,以保證合理地使用公共資源
4、Exchanger : 用於線程間協作的工具類
1、CountDownLatch(倒計時 門栓):讓一些線程阻塞直到另一些線程完成一系列操作後才喚醒。
白話理解:比如一輛拉客麪包車,車裏能做5個人,司機等到5個都坐上來了纔可以發車。
實現:它通過調用await方法讓線程進入阻塞狀態等待倒計時0時喚醒。
它通過線程調用countDown方法讓倒計時中的計數器減去1,當計數器爲0時,會喚醒哪些因爲調用了await而阻塞的線程。
底層實現:底層是使用AQS實現的
案列:假設老闆開一個緊急會議,他先到會議室等着所有人簽到然後開始開會,可以使用CountDownLatch進行模擬。
public static void main(String[] args) {
CountDownLatch countDownLatch=new CountDownLatch(5);
for (int i=1;i<=5;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"簽到!");
countDownLatch.countDown();
},"第"+i+"個人").start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老闆宣佈人夠了開始開會!");
}
運行結果如下:
第1個人簽到!
第2個人簽到!
第5個人簽到!
第4個人簽到!
第3個人簽到!
老闆宣佈人夠了開始開會!
重點: 場景1:當多線程併發情況下,如果有四個線程,前三個線程併發執行完纔可以執行最後一個線程,那麼可以使用CountDownLatch來實現
場景2實戰地址:https://www.cnblogs.com/wenjunwei/p/10573289.html
場景2:當多線程情況下,如果有四個線程,要按照順序一個一個執行,那麼也可以使用CountDownLatch來實現
其他博客參考:https://www.cnblogs.com/wangsen/p/11170709.html