CyclicBarrier
CyclicBarrier和CountDownLatch功能相似。CyclicBarrier是所有參與線程互相等待對方執行到某點,再一起執行後面程序。
與CountDownLatch一樣,CyclicBarrier的構造函數也需要一個int類型的參數 parties,表示參與者數量。每一個線程調用cyclicBarrier對象的await方法就會進入等待。直到參與線程數量到達parties時,喚醒所有線程。
場景:所有參與者進入等待,在執行
final CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for(int i=0 ;i<5;i++){
final int c=i;
new Thread(){
@Override
public void run() {
try {
System.out.println(String.format("參與者%d等待",c));
cyclicBarrier.await();
System.out.println(String.format("參與者%d執行",c));
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
執行結果
參與者3等待
參與者1等待
參與者2等待
參與者4等待
參與者0等待
參與者3執行
參與者0執行
參與者1執行
參與者2執行
參與者4執行
CyclicBarrier和CountDownLatch的區別
- CyclicBarrier內部用條件變量Condition實現,會產生上下文切換。CountDownLatch使用樂觀鎖實現。
- CyclicBarrier當parties=0時,在喚醒所有線程同時,還會重置parties。 CountDownLatch不能重置回滾。
CyclicBarrier使用場景
-
迭代算法併發化。迭代中,由多個工作線程完成工作。使用await等待所有工作線程完成工作,再將結果作爲下一輪迭代的輸入。
-
模擬高併發。保證線程同時開始其操作來模擬高併發測試。