CountDownLatch
CountDownLatch可看作是一個同步工具類,它允許一個或多個線程一直等待,直到其他線程的操作執行完後再執行 。例如,應用程序的主線程希望在負責啟動框架服務的線程已經啟動所有的框架服務之後再執行。
假如有:main線程 A、B、C、D、E 5個線程,模擬五個學生跑步,跑步完成後統計跑步成績。
測試類outLine效果如下:
具體如下:
學生具體的跑步實現如下:
ps:main線程調用await方法暫時中斷(調用此方法後CountDownLatch的計數器減為0時會繼續執行),A/B/C/D/E5個線程調用countDown方法讓CountDownLatch的計數器減1。以此來達到讓A/B/C/D/E五個線程都執行完後main線程才能執行的目的。
執行結果如下:
不足之處:看打印結果可發現5個學生沒有同時起跑,即沒有實現線程同步執行的場景,要實現此場景可藉助CyclicBarrier來實現。
CyclicBarrier
CyclicBarrier字面意思迴環柵欄 通過它可以實現讓一組線程等待至某個狀態(barrier狀態)之後再全部同時執行。
我們改動main方法如下:
重新運行程序,結果如下:
至此,已實現5個線程同步執行的場景。
Semaphore
翻譯成字面意思為 信號量,Semaphore可以控同時訪問的線程個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。
閱讀更多 Java高級開發 的文章