CyclicBarrier
CyclicBarrier也可以向
CountDownLatch`一樣,協調多個線程的執行。只是略有不同的是,CountDownLatch是減至0,而CyclicBarrier是加至某個數字。
舉例:就好比 只有集齊了7顆龍珠才能召喚神龍
常用API方法如下
CyclicBarrier(int parties) 創建一個新的 CyclicBarrier ,它將在給定數量的參與者(線程)處於等待狀態時啓動,但它不會在每個 barrier 上執行預定義的操作。 |
---|
CyclicBarrier(int parties, Runnable barrierAction) 創建一個新的 CyclicBarrier,它將在給定數量的參與者(線程)處於等待狀態時啓動,並在啓動 barrier 時執行給定的屏障操作,該操作由最後一個進入 barrier 的線程執行。 |
舉例:
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> System.out.println("召喚神龍"));
for (int i = 1; i <= 7; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "正在找龍珠~");
Thread.sleep(2 * 1000);
System.out.println(Thread.currentThread().getName() + "找到龍珠~");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, String.valueOf("線程" + i)).start();
}
}
}
結果:
線程1正在找龍珠~
線程2正在找龍珠~
線程3正在找龍珠~
線程4正在找龍珠~
線程5正在找龍珠~
線程6正在找龍珠~
線程7正在找龍珠~
線程1找到龍珠~
線程4找到龍珠~
線程6找到龍珠~
線程3找到龍珠~
線程2找到龍珠~
線程7找到龍珠~
線程5找到龍珠~
召喚神龍