CountDownLatch是JUC包下比较有名的并发工具,也就是大家熟知的发令枪,类似Lock,借助了AQS队列同步器来完成功能,下面是比较简单的例子:
CountDownLatch latch=new CountDownLatch(2);
Work worker1=new Work("程序员1", 5000, latch);
Work worker2=new Work("程序员2", 8000, latch);
worker1.start();//
worker2.start();//
latch.await();//
System.out.println("程序员可以下班了,下班时间: "+sdf.format(new Date()));
Work是线程定义如下:
class Work extends Thread{
String Name;
int workTime;
CountDownLatch latch;
public Work(String Name ,int workTime ,CountDownLatch latch){
this.Name=Name;
this.workTime=workTime;
this.latch=latch;
}
public void run(){
System.out.println(Name+" 开始工作,现在时间是 "+sdf.format(new Date()));
doSomething();
System.out.println(Name+" 工作完成,现在时间是 "+sdf.format(new Date()));
latch.countDown();
}
private void doSomething(){
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果如下:
程序员1 开始工作,现在时间是 2018-05-03 16:18:45
程序员2 开始工作,现在时间是 2018-05-03 16:18:45
程序员1 工作完成,现在时间是 2018-05-03 16:18:50
程序员2 工作完成,现在时间是 2018-05-03 16:18:53
程序员可以下班