CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器,CountDownLatch通过构造函数传入一个初始计数值,调用者可以通过调用CounDownLatch对象的cutDown()方法,来使计数减1;如果调用对象上的await()方法,那么调用者就会一直阻塞在这里,直到别人通过cutDown方法,将计数减到0,才可以继续执行。
常用于监听某些初始化操作,等待初始化完毕之后通知主线程继续工作.或者有一个线程需要等待其他线程完成之后才能执行
public class CountDownLatchTest {
public static void main(String[] args) {
/**
* 1.创建一个CountDownLatch对象,设置需要等待线程的计数器
* 2.创建三个线程t1,t2,t3.t1线程需要等待t2,t3执行完成之后再继续执行
* 3.在t1线程执行时调用await()来等等待t2,t3执行完成
* 4.在t2,t3执行时调用countDown()通知t1线程开始执行,即计数器减一
* 5.当t2,t3都执行完成时t1开始执行
*/
final CountDownLatch countDown = new CountDownLatch(2);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("进入t1线程,等待其他线程处理完成");
countDown.await();
System.out.println("t1线程继续执行");
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("t2线程进行初始化操作");
Thread.sleep(3000);
System.out.println("t2线程初始化完毕,通知t1线程继续。。。");
countDown.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("t3线程进行初始化操作");
Thread.sleep(4000);
System.out.println("t3线程初始化完毕,通知t1线程继续。。。");
countDown.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t3.start();
}
}
执行结果如下