CyclicBarrier使用詳解
1. CyclicBarrier 是什么?
從字面上的意思可以知道,這個類的中文意思是“循環柵欄”。大概的意思就是一個可循環利用的屏障。
它的作用就是會讓所有線程都等待完成后才會繼續下一步行動。
舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規定必須等到所有人到齊之后才會讓我們進去。這里的朋友們就是各個線程,餐廳就是 CyclicBarrier。
2. 怎么使用 CyclicBarrier
2.1 構造方法
public CyclicBarrier(int parties) public CyclicBarrier(int parties, Runnable barrierAction)
解析:
- parties 是參與線程的個數
- 第二個構造方法有一個 Runnable 參數,這個參數的意思是最后一個到達線程要做的任務
2.2 重要方法
public int await() throws InterruptedException, BrokenBarrierException public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
解析:
- 線程調用 await() 表示自己已經到達柵欄
- BrokenBarrierException 表示柵欄已經被破壞,破壞的原因可能是其中一個線程 await() 時被中斷或者超時
2.3 基本使用
2.3.1 需求
一個線程組的線程需要等待所有線程完成任務后再繼續執行下一次任務
2.3.2 代碼實現
public class CyclicBarrierDemo { static class TaskThread extends Thread { CyclicBarrier barrier; public TaskThread(CyclicBarrier barrier) { this.barrier = barrier; } @Override public void run() { try { Thread.sleep(1000); System.out.println(getName() + " 到達柵欄 A"); barrier.await(); System.out.println(getName() + " 沖破柵欄 A"); Thread.sleep(2000); System.out.println(getName() + " 到達柵欄 B"); barrier.await(); System.out.println(getName() + " 沖破柵欄 B"); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { int threadNum = 5; CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 完成最后任務"); } }); for(int i = 0; i < threadNum; i++) { new TaskThread(barrier).start(); } } } 打印結果: Thread-1 到達柵欄 A Thread-3 到達柵欄 A Thread-0 到達柵欄 A Thread-4 到達柵欄 A Thread-2 到達柵欄 A Thread-2 完成最后任務 Thread-2 沖破柵欄 A Thread-1 沖破柵欄 A Thread-3 沖破柵欄 A Thread-4 沖破柵欄 A Thread-0 沖破柵欄 A Thread-4 到達柵欄 B Thread-0 到達柵欄 B Thread-3 到達柵欄 B Thread-2 到達柵欄 B Thread-1 到達柵欄 B Thread-1 完成最后任務 Thread-1 沖破柵欄 B Thread-0 沖破柵欄 B Thread-4 沖破柵欄 B Thread-2 沖破柵欄 B Thread-3 沖破柵欄 B
從打印結果可以看出,所有線程會等待全部線程到達柵欄之后才會繼續執行,并且最后到達的線程會完成 Runnable 的任務。
3. CyclicBarrier 使用場景
可以用于多線程計算數據,最后合并計算結果的場景。
4. CyclicBarrier 與 CountDownLatch 區別
- CountDownLatch 是一次性的,CyclicBarrier 是可循環利用的
- CountDownLatch 參與的線程的職責是不一樣的,有的在倒計時,有的在等待倒計時結束。CyclicBarrier 參與的線程職責是一樣的。

浙公網安備 33010602011771號