CyclicBarrier是java.util.concurrent包下的一個同步輔助類,類似於CountDownLatch,也是一個同步計數器。
與CountDownLatch不同的區別是:
CountDownLatch的await()方法阻塞的原因是等待調用一定次數的countDown()方法, 可以在同一線程完成;
CyclicBarrier的await()方法阻塞的原因是等待一定數量的線程調用await()方法, 必須在不同線程調用
所以,概括來說:
CountDownLatch是等待一定數量次調用countDown(),否則調用await()方法的線程會阻塞。
CyclicBarrier 是等待一定數量線程調用await(),否則所有調用await()的線程會阻塞。
演示代碼:
import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestCyclicBarrier { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); /** * 表示必須每5個線程各執行了CyclicBarrier的await()方法, 纔會執行CyclicBarrier裏的run方法; * 如果不足5個線程執行await()方法, 那麼執行await()方法的線程將會阻塞, 直到第5個線程執行了await()方法; */ final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable(){ public void run() { System.out.println("大家都到齊了,開始happy去"); } }); final Random random=new Random(); for(int i = 0; i < 5; i++) { exec.execute(new Runnable(){ public void run() { try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"到了,其他哥們呢"); try { //等待剩餘的線程執行await()方法; cyclicBarrier.await(); } catch(InterruptedException e) { e.printStackTrace(); } catch(BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"說: 人齊了, 打球去吧..."); } }); } exec.shutdown(); } }