java.util.concurrent.CountDownLatch 允许一个或多个线程等待其他线程完成操作
它的API:
构造方法: public CountDownLatch(int count) 初始化一个指定计数器的CountDownLatch对象
成员方法:
- public void await() 让当前线程等待(当计数器的数值为0,那么等待结束)
- pulic void countDown() 计数器进行 减 1 操作
例如:线程1要执行打印:A和C,线程2要执行打印:B
但是要求线程1打印C之前,一定要打印B
分析:
线程1:
任务:
打印A
调用await方法 进入等待(等待线程2执行打印)
打印C
线程2:
任务:
调用countDown方法,让计数器 -1
注意:
1.创建CountDownLatch对象的计数器初始值为 1
public class Thread1 extends Thread{
// 定义 CountDownLatch cdl 为成员变量
CountDownLatch cdl ;
// 定义带参构造方法,这样 初始化线程的时候就可以把 CountDownLatch cdl对象加进来
public Thread1(CountDownLatch cdl) {
this.cdl = cdl;
}
@Override
public void run() {
System.out.println("打印A");
try {
cdl.await(); // 等待计数器变成 0 --》等待线程2执行完之后计数器 -1 这里就会开始执行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("打印C");
}
}
public class Thread2 extends Thread{
CountDownLatch cdl;
public Thread2(CountDownLatch cdl) {
this.cdl = cdl;
}
@Override
public void run() {
System.out.println("打印B...");
cdl.countDown(); // 计数器 -1
}
}
public class Tests {
// 创建 CountDownLatch 对象,指定计数器的值为 1
public static void main(String[] args) {
CountDownLatch cdl = new CountDownLatch(1);
// 创建两个线程分别执行打印操作
new Thread1(cdl).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread2(cdl).start();
}
CountDownLatch 中的 countdown倒数的意思
latch 翻译过来是门闩
整体含义可以理解为倒数的门闩,【三二一,芝麻开门】
CountDownLatch是通过一个计数器来实现的,每当一个线程完成了自己的任务后,
可以调用countdown方法让计数器 -1.当计数器到达 0 的时候调用CountDownLatch
await 方法的线程阻塞状态解除,继续执行
调用await方法的线程会被挂起,它会等待直到count值为0的时候才继续执行