CountDownLatch
-
java文档是这么说的
public class CountDownLatch extends Object
允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
A
CountDownLatch
用给定的计数初始化。await
方法阻塞,直到由于countDown()
方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await
调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier
。A
CountDownLatch
是一种通用的同步工具,可用于多种用途。 一个CountDownLatch
为一个计数的CountDownLatch用作一个简单的开/关锁存器,或者门:所有线程调用await
在门口等待,直到被调用countDown()
的线程打开。 一个CountDownLatch
初始化N可以用来做一个线程等待,直到N个线程完成某项操作,或某些动作已经完成N次。CountDownLatch
一个有用的属性是,它不要求调用countDown
线程等待计数到达零之前继续,它只是阻止任何线程通过await
,直到所有线程可以通过。 -
方法详细是这样说的
-
await
public void await() throws InterruptedException
导致当前线程等到锁存器计数到零,除非线程是interrupted 。
如果当前计数为零,则此方法立即返回。
如果当前计数大于零,则当前线程将被禁用以进行线程调度,并处于休眠状态,直至发生两件事情之一:
- 由于
countDown()
方法的调用,计数达到零; 要么 - 一些其他线程interrupts当前线程。
如果当前线程:
- 在进入该方法时设置了中断状态; 要么
- 是interrupted等待,
然后
InterruptedException
被关上,当前线程的中断状态被清除。- 异常
InterruptedException
- 如果当前线程在等待时中断-
countDown
public void countDown()
减少锁存器的计数,如果计数达到零,释放所有等待的线程。
如果当前计数大于零,则它将递减。 如果新计数为零,则所有等待的线程都将被重新启用以进行线程调度。
如果当前计数等于零,那么没有任何反应。
-
toString
public String toString()
返回一个标识此锁存器的字符串及其状态。 括号中的状态包括字符串
"Count ="
后跟当前计数。- 重写:
toString
在类别Object
- 结果
识别此锁存器的字符串以及其状态
-
-
拓展
与CountDownLatch相似的还有CyclicBarrier
线程在countDown()之后,会继续执行自己的任务,在此之前自己的任务await;而CyclicBarrier会在所有线程任务结束之后,才会进行后续任务,在此之前其他任务await
CyclicBarrier可以重复利用
允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
CyclicBarrier
支持一个可选的Runnable
命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。