CountDownLatch(int count);
紧张供应了以下方法:
// 等待计数器为0public void await() throws InterruptedException;// 等待计数器为0,增加超时限定public boolean await(long timeout, TimeUnit unit) throws InterruptedException;// 计数器减1public void countDown();
CountDownLatch适宜检讨事宜完成条件,都完成后触发一系列的动作。demo如下:
public class CountDownLatchDemo implements Runnable {static final CountDownLatch end = new CountDownLatch(10);static final CountDownLatchDemo demo = new CountDownLatchDemo();@Overridepublic void run() {try {// 仿照检讨任务Thread.sleep(new Random().nextInt(10) 1000);System.out.println(\公众check complete\"大众);end.countDown();} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) throws InterruptedException {ExecutorService exec = Executors.newFixedThreadPool(10);for (int i = 0; i < 10; i++) {exec.submit(demo);}// 等待检讨end.await();// 发射火箭System.out.println(\公众Fire!\"大众);exec.shutdown();}}
主线程进入await()时,进入等待状态。然后当倒计数器为0时,触发唤醒操作,打印\"大众Fire!\公众。

CyclicBarrier 的用法和 CountDownLatch 非常类似,但是功能更加强大。它可以实现反复的倒计数的功能,例如有多级的状态检讨就可以利用。供应了2个布局器:
public CyclicBarrier(int parties);public CyclicBarrier(int parties, Runnable barrierAction);
第一个布局器创建了计数器为n的循环栅栏;第二个布局器在第一个的根本上增加了到达\"大众栅栏\"大众时,须要触发的动作(一个线程),系统会自动启动线程。
下面给出一个demo:
public class CyclicBarrierDemo {public static class Soldier implements Runnable {private String soldier;private final CyclicBarrier cyclic;public Soldier(String soldier, CyclicBarrier cyclic) {this.soldier = soldier;this.cyclic = cyclic;}@Overridepublic void run() {try {// 等待所有士兵到齐cyclic.await();doWork();// 等待所有士兵完成事情cyclic.await();} catch (Exception e) {e.printStackTrace();}}void doWork() {try {Thread.sleep(Math.abs(new Random().nextInt() % 10000));} catch (Exception e) {e.printStackTrace();}System.out.println(soldier + \"大众: 完成任务\"大众);}}public static class BarrierRun implements Runnable {boolean flag;int N;public BarrierRun(boolean flag, int n) {this.flag = flag;N = n;}@Overridepublic void run() {if (flag) {System.out.println( N + \"大众 个士兵完成任务\"大众);} else {System.out.println( N + \"大众 个士兵凑集完毕\"大众);flag = true;}}}public static void main(String[] args) {final int N = 10;Thread[] allSoldier = new Thread[N];boolean flag = false;CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(flag, N));System.out.println(\"大众凑集军队\"大众);for (int i = 0; i < 9; i++) {System.out.println(\"大众士兵\公众 + i + \"大众报到\公众);allSoldier[i] = new Thread(new Soldier(\"大众士兵\"大众 + i, cyclic));allSoldier[i].start();}}}
从上述代码可以看出,主线程中创建了一个大小为10的循环栅栏,并且传入了一个实行动作 BarrierRun。此时,创建了10个Soldier工具,并且每个线程内部都调用了cyclic.await()。每一次 await() 的调用,都会触发计数器减1。当减为0时,触发 BarrierRun 运行。Soldier中有两个 cyclic.await() 操作,以是有2个栅栏。
上面代码,如果在主线程中的循环次数少于10,则永久到不了栅栏。