原文地址:https://blog.csdn.net/tongdanping/article/details/79589253
CountDwonLatch(闭锁)
CountDwonLatch用来等待一个或者多个线程完成操作,作用类似于当前线程里调用join()方法,让当前线程等待join()进来的线程执行完毕再执行当前线程剩下的逻辑,但是CountDownLatch比join()的功能更加强大,使用方法如下:
public class CountDownLatchTest {
//新建一个CountDwonLatch对象并传入计数器的值 2
static CountDownLatch cdl = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
try{
System.out.println("thread 1: 1 ");
Thread.sleep(1000);
System.out.println("thread 1 : 2");
//在被等待的线程或者步骤执行完毕后调用countDwon()方法让计数器减1
cdl.countDown();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
try{
System.out.println("thread 2 : 1");
Thread.sleep(1000);
System.out.println("thread 2 : 2");
//在被等待的线程或者步骤执行完毕后调用countDwon()方法让计数器减1
cdl.countDown();
}
catch(InterruptedException e){
e.printStackTrace();
}
} }).start();
//在等待的主线程中调用await()方法等待其他线程,直到计数器为0 再执行主线程接下来的逻辑
cdl.await();
System.out.println("thread : main");
}
}
无论怎么执行,thread : main 总是最后输出
输出结果:
CountDwonLatch的使用方法:
在CountDwonLatch中,countDwon()方法和await()方法搭配使用才能起到类似join()的作用:
(1)首先创建一个CountDwonLatch对象并传入要等待的线程的数量,这是个计数器;
(2)在被等待的线程或者步骤执行完毕后调用countDwon()方法让计数器减1,countDwon()方法是一个等待的计数器,每次调用countDwon()方法,计数器减1,直到计数器为0,countDwon可以用在任何地方,可以是一个步骤的一个点,也可以是一个线程。
(3)在等待其他线程的主线程中,调用await()方法来等待其他调用了countDwon()的线程,直到计数器为0,再执行该线程接下来的逻辑,当然,如果某个线程执行的时间过久,当前线程不可能一直等待,那么可以调用await(long time, TimeUnit unit)方法。
使用场景:
一个线程等到其它几个线程执行完才能执行的场景;