11.线程间协作:倒计时协调器CountDownLatch
1.使用
工具类CountDownLatch可以用来实现一个(或者多个)线程等待其他线程完成一组特定的操作之后才继续运行。这组操作被称为先决操作。CountDownLatch内部会维护一个用于表示未完成的先决操作数量的计数器 。CountDownLatch.countDown() 每被执行一次就会使相应实例的计数器值减少1。当计数器值不为0时CountDownLatch.await() 的执行线程会被暂停,这些线程就被称为相应CountDownLatch上的等待线程。CountDownLatch.countDown()相当于一个通知方法,它会在计数器值达到0的时候唤醒相应实例上的所有等待线程。计数器的初始值是在 CountDownLatch 的构造参数中指定的, 如下声明所示:
public CountDownLatch(int count)
客户端代码在使用CountDownLatch实现等待/通知的时候调用 await 、 countDown 方法都无须加锁。
2.注意问题
- count 参数用于表示先决操作的数量或者需要被执行的次数。当计数器的值达到0之后,该计数器的值就不再发生变化。此时,调用CountDownLatch.countDown()并不会导致异常的抛出,并且后续执行CountDownLatch.await() 的线程也不会被暂停。因此,CountDownLatch 的使用是一次性的:一个 CountDownLatch 实例只能够实现一次等待和唤醒。
- 为了避免等待线程永远被暂停,CountDownLatch.countDown()调用必须放在代码中总是可以被执行到的地方,例如 finally 块中 。