非常有用的並發控制-循環柵欄CyclicBarrier


昨天我講了倒計時器CountDownLatch的應用,它是阻塞線程直到計時器歸0的一種等待方式。今天講的這個循環柵欄CyclicBarrier與倒計時器非常類似,但它比倒時器更加強大且稍微復雜,它也是並發控制中非常實用的工具。

循環柵欄CyclicBarrier,從英語字義可以理解為它是可以循環利用的,且柵欄是用來阻止線程在柵欄外等待的,它同樣是阻止線程等待,它和CountDownLatch倒底有什么區別呢?

給你出道題,5個線程同時執行,當每個線程都執行了某段代碼后再繼續往下執行,如果5個線程未到齊,否則其他線程一直等待。

從上面的題目,我們來看下面的例子,理解什么是循環柵欄。

首先CyclicBarrier構造方法接受5個線程數和線程聚齊時的回調線程。什么意思呢?就是當5個線程都調用了await()方法,這5個線程才繼續往下執行,執行前先運行到齊時的回調線程。

從例子輸出的結果可以看出cb finish先運行的,說明到齊運行了回調線程,再輸出了每個線程的耗時,我們控制10個線程來阻塞等待,而循環柵欄只有5個,說明它是可以循環利用的,每到齊5個線程阻塞的線程就繼續執行。

需要注意的await方法會拋出異常,一個是中斷異常InterruptedException,即是其他線程中斷了這個線程,另外一個是BrokenBarrierException,如果1個線程被打斷出現InterruptedException,其他等待在循環柵欄外面的線程就會出現BrokenBarrierException。因為一個線程被打斷了,即打破了循環柵欄的完整性,導致線程不能到齊其他線程永遠不能繼續執行,這個異常也就避免了線程永遠等待的情況。

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM