1,CountDownLatch在java.util.concurrent并发包下,在并发编程中经常使用。它允许一个线程或多个线程等待其他若干个线程执行到一定阶段或执行完成之后才开始执行。然而线程的join()也能实现这一个功能,那他们之间在使用上有什么区别呢?
接下来我通过一个例子说明一下两者在使用上的区别,不涉及底层实现和性能的考虑。
请看代码:
/**
* Created by dengtianguang on 2018/9/13.
* 对于CountDownLatch和Join的区别
*
* 场景1:工人1,2,3 协作完成一项工作。工人3必须等待工人1和工人2完成了手头的工作,工人3才能开始自己的工作
* 这种情况下,使用CountDownLatch和Join效果相同
*
* 场景2:工人1,2,3 还是协作完成一项工作,工人3在工人1和2完成第一阶段的准备工作之后就可以开始手头的工作,
* 不用等待工人1和工人2 完成工作才开始自己的工作,这样可以提高效率,下班一起去撸串
* 场景2用Join就无法实现,而使用CountDownLatch完成满足需求
*/
public class CountDownLatchTest {
public static void main(String[] args) {
//等待其他两个工人完成第一阶段的工作
CountDownLatch latch = new CountDownLatch(2);
Worker work1 = new Worker("worker1",(long)(Math.random()*2000+3000),latch);
Worker work2 = new Worker("worker2",(long)(Math.random()*2000+3000),latch);
Worker work3 = new Worker("worker3",(long)(Math.random()*2000+3000),latch);
work1.start();
work2.start();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("other workers is all ready===========");
work3.start();
}
}
class Worker extends Thread{
private String workerName;
//第一阶段工作时间
private long firstSleepTime;
//闭锁
private CountDownLatch latch;
public Worker(String name,long time,CountDownLatch latch){
//构造方法
this.workerName = name;
this.firstSleepTime = time;
this.latch = latch;
}
@Override
public void run(){
System.out.println(workerName +" start working ....");
try {
//第一阶段工作时间
Thread.sleep(firstSleepTime);
System.out.println(workerName +" first step work is over!!!!!!");
latch.countDown();
Thread.sleep(2000);
System.out.println(workerName +" second step work is over!!!!!!!!!!");
System.out.println(workerName +" work is over, work time is:" + firstSleepTime+2000 +"ms");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}