倒计数器:CountDownLatch
CountDownLatch从名字就可以看出其作用:初始化一个计数,然后每次递减,直至为0,然后触发一个动作。只有一个带参构造器:
主要提供了以下方法:
CountDownLatch适合检查事件完成条件,都完成后触发一系列的动作。demo如下:
主线程进入await()时,进入等待状态。然后当倒计数器为0时,触发唤醒操作,打印"Fire!"。
循环栅栏:CyclicBarrier
CyclicBarrier的用法和CountDownLatch非常类似,但是功能更加强大。它可以实现反复的倒计数的功能,例如有多级的状态检查就可以使用。提供了2个构造器:
第一个构造器创建了计数器为n的循环栅栏;第二个构造器在第一个的基础上增加了到达"栅栏"时,需要触发的动作(一个线程),系统会自动启动线程。
下面给出一个demo:
从上述代码可以看出,主线程中创建了一个大小为10的循环栅栏,并且传入了一个执行动作BarrierRun。此时,创建了10个Soldier对象,并且每个线程内部都调用了cyclic.await()。每一次await()的调用,都会触发计数器减1。当减为0时,触发BarrierRun运行。Soldier中有两个cyclic.await()操作,所以有2个栅栏。
上面代码,如果在主线程中的循环次数少于10,则永远到不了栅栏。