CountDownLatch:线程计数器,等待其他线程完成,再执行主线程
CountDownLatch latch = new CountDownLatch(2);//声明一个CountDownLatch,计数器为2
常用方法:
method | description |
---|---|
await() | 线程被挂起,它会等待直到count值为0才继续执行 |
await(long timeout, TimeUnit unit) | 线程被挂起,设置超时时间,如果到了超时时间count还不为0,则将会继续向下执行,执行主线程 |
countDown() | 讲count计数器做减1操作 |
应用场景
当我们要做一个2W条的查询,如果单线程运行等待的时间会非常久,这时我们可以考虑运行2个子线线程并行查询,每个子线程查询1W条数据,等子线程查询都结束后,再交由主线程进行汇总处理。
代码如下:
import java.util.concurrent.CountDownLatch;
/**
* 线程计数器,等待其他线程完成,再执行主线程,例:并发查询
*/
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
final int threadSize = 2;
CountDownLatch latch = new CountDownLatch(threadSize);
for (int i =1;i<=threadSize;i++){
final int x =i;
new Thread(()->{
System.out.println("第"+x+"个线程查询,正在运行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第"+x+"个线程查询,运行完毕");
latch.countDown();
}).start();
}
System.out.println("等待所有查询查询完毕");
latch.await();
System.out.println("所有查询查询完毕");
System.out.println("继续执行主线程汇总。。。。。。。");
}
}
执行结果
等待所有查询查询完毕
第1个线程查询,正在运行
第2个线程查询,正在运行
第1个线程查询,运行完毕
第2个线程查询,运行完毕
所有查询查询完毕
继续执行主线程汇总。。。。。。。