昨天我講了倒計時器CountDownLatch的應用,它是阻塞線程直到計時器歸0的一種等待方式。今天講的這個循環柵欄CyclicBarrier與倒計時器很是相似,但它比倒時器更增強大且稍微複雜,它也是併發控制中很是實用的工具。java
循環柵欄CyclicBarrier,從英語字義能夠理解爲它是能夠循環利用的,且柵欄是用來阻止線程在柵欄外等待的,它一樣是阻止線程等待,它和CountDownLatch倒底有什麼區別呢?面試
給你出道題,5個線程同時執行,當每一個線程都執行了某段代碼後再繼續往下執行,若是5個線程未到齊,不然其餘線程一直等待。後端
從上面的題目,咱們來看下面的例子,理解什麼是循環柵欄。多線程
首先CyclicBarrier構造方法接受5個線程數和線程聚齊時的回調線程。什麼意思呢?就是當5個線程都調用了await()方法,這5個線程才繼續往下執行,執行前先運行到齊時的回調線程。架構
從例子輸出的結果能夠看出cb finish先運行的,說明到齊運行了回調線程,再輸出了每一個線程的耗時,咱們控制10個線程來阻塞等待,而循環柵欄只有5個,說明它是能夠循環利用的,每到齊5個線程阻塞的線程就繼續執行。併發
須要注意的await方法會拋出異常,一個是中斷異常InterruptedException,便是其餘線程中斷了這個線程,另一個是BrokenBarrierException,若是1個線程被打斷出現InterruptedException,其餘等待在循環柵欄外面的線程就會出現BrokenBarrierException。由於一個線程被打斷了,即打破了循環柵欄的完整性,致使線程不能到齊其餘線程永遠不能繼續執行,這個異常也就避免了線程永遠等待的狀況。工具
推薦去個人博客閱讀更多:線程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程ip
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
以爲不錯,別忘了點贊+轉發哦!