countDownLatch是Java.util.concurrent里的并发工具包。它是让某个线程等待其他线程处理完再执行。
所用场景:例如导出10万条的订单记录时,需要对每一条订单记录进行处理后再导出,这是由于数据量过大需要采用10个线程对这10万条数据进行处理,那么导出execel的这个动作或者线程需等待上面10个线程处理完再执行。
构造方法:new CountDownLatch(int count);count 为需要等待的线程数。例如上述场景是等待10个线程,这里count就为10。
核心api:
countDown();每执行一次count就减一,即等待的线程数减一。
await();执行这个方法时,如果count不为0,则执行这个方法的线程阻塞直到count变为0
用java伪代码举例一个。
public class CountDownLatchTest{
static CountDownLatch count = new CountDownLatch(3);
static List<Integer> number = new ArrayList<Integer>();
public static void main(String[] args){
CountDownLatchTest test = new CountDownLatchTest();
Thread.currentThread().setName("主线程");
new Thread(test.new Number(number,10,count),"线程1").start();//线程1塞数据
new Thread(test.new Number(number,20,count),"线程2").start();//线程2塞数据
new Thread(test.new Number(number,30,count),"线程3").start();//线程3塞数据
try {
System.out.println(Thread.currentThread().getName()+"等待");
count.await();//主线程等待线程1,2,3执行
//线程1,2,3执行结束,主线程开始执行System.out.println(Thread.currentThread().getName()+"执行");
int sum =0;
for(Integer num:number){
sum =sum+num;
}
System.out.println("number计算总和结果"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class Number implements Runnable{
List<Integer> number;
int index;
CountDownLatch count;
public void run() {
System.out.println(Thread.currentThread().getName()+"执行......");
synchronized (number) {
for(int i=0;i<index;i++){
number.add(i);
}
count.countDown();
}
System.out.println(Thread.currentThread().getName()+"结束......");
}
Number(List<Integer> number,int index,CountDownLatch count){
this.number=number;
this.index=index;
this.count=count;
}
}
}
执行结果: