CountDownLatch是一个同步工具类,用来协调多个线程之 间的同步。其能够使 一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后 在CountDownLatch上等待的线程就可以恢复执行任务。
缺点:不可重用
使用场景:一等多
示例代码:
CountDownLatchTest类:
public class CountDownLatchTest {
//创建两个线程计数器
private CountDownLatch countDownLatch = new CountDownLatch(2);
public void countDown() throws InterruptedException {
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "正在进行加工纸杯任务...");
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "加工完成");
countDownLatch.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "正在进行热水任务...");
try {
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + "热水任务完成");
countDownLatch.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
System.out.println(Thread.currentThread().getName() + "等待喝水...");
//等待其它线程完成任务
countDownLatch.await();
System.out.println("喝水完成");
}
}
Main类:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("-----------countDownLatch测试------------------");
new CountDownLatchTest().countDown();
}
测试结果:
从测试结果可以看出,main线程的喝水等待纸杯完成和热水任务完成才执行。CountDownLatch一等多场景可见。