CountDownLatch
CountDownLatch
可以看作一个计数器,并且这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。先看一下常用的几个重要方法,首先看构造方法:
CountDownLatch countDownLatch=new CountDownLatch(count);
复制代码
构造器中传入的count
为int
类型,这个计数器的初始值就是需要等待的线程数量。这个值只能被设置一次,并且CountDownLatch
不提供任何方法去修改或重置这个值。
countDown
方法:
countDownLatch.countDown();
复制代码
每当一个线程完成了自己的任务后,调用该方法,计数器的值减1。当计数器的值为0时,表示所有线程都已经完成了任务,然后在锁上等待的线程就可以恢复执行任务。
await
方法:
countDownLatch.await();
复制代码
一般主线程在启动其他线程后调用该方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。一般而言,与CountDownLatch
的第一次交互就是在这里,主线程等待其他线程。
下面以一个例子来看一下具体的使用:假设我们通过第三方机构查询机票,第三方会分别去统计各个航空公司的现存票数,查询全部完成后再返回结果。主线程:
public class