应用场景
程序中需要等待多线程任务全部执行完毕后,再执行后续操作。
主要方法
使用方法
1、确定了你开启的线程数,那么在主程序运行前。
CountDownLatch countdown = new CountDownLatch(10);//这里的10就是你的子线程数。
2、在每个子线程结束后,调用 countdown.countDown();
当前线程调用此方法,则计数减一
3、在主线程里启动多线程的方法后面添加:countdown.await();//这里进行同步等待
调用此方法会一直阻塞当前线程,直到计时器的值为0。
4、等所有子线程结束后,执行 countdown.await()后面的代码。
实现代码
public class CountDownLatchDemo {
final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws InterruptedException {
//步骤1:确定开启的线程数,声明CountDownLatch对象 ,对象需要作为入参,传给多线程的构造函数
CountDownLatch latch=new CountDownLatch(2);
Worker worker1=new Worker("zhang san", 5000, latch);
Worker worker2=new Worker("li si", 8000, latch);
worker1.start();//
worker2.start();//
//步骤3、4、调用await放过,等待所有线程完成工作
latch.await();
System.out.println("全部线程执行完毕!可以开始后续操作:" + sdf.format(new Date()));
}
static class Worker extends Thread{
String workerName;
int workTime;
CountDownLatch latch;
public Worker(String workerName ,int workTime ,CountDownLatch latch){
this.workerName=workerName;
this.workTime=workTime;
this.latch=latch;
}
public void run(){
System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
doWork();//工作了
System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
//步骤2、每个线程run方法完成工作后,将计数器减一
latch.countDown();
}
private void doWork(){
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}