等待指定线程执行完毕之后才开始执行,有点类似于join方法
这个类使一个线程等待其他线程都执行完毕之后再执行。使通过一个计数器来实现的,计数器的初始值是线程的数量,每当一个线程执行完毕之后,调用countDown方法,计算器值减1,当计数器的值为0时,表示所有线程都执行完毕了,等待的线程就可以恢复工作了。
(一)常用API
1.1 构造器
count参数为要等待的线程总数
1.2 常用方法
// 调用 await() 方法的线程会被挂起,它会等待直到 count 值为 0 才继续执行
public void await() throws InterruptedException { };
// 和 await() 类似,若等待 timeout 时长后,count 值还是没有变为 0,不再等待,继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
// 会将 count 减 1,直至为 0
public void countDown() { };
案例:有三个线程A,B,C 其中A和B线程分别执行拍照和打卡任务,C线程执行数据上传任务,需要等待A和B执行完成之后才能执行。
public class Test {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(2);
Thread a = new Thread(() -> {
try {
Thread.sleep(2000);
System.out.println("拍照任务完成");
countDownLatch.countDown();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
Thread b = new Thread(() -> {
try {
Thread.sleep(2000);
System.out.println("打卡任务完成");
countDownLatch.countDown();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
Thread c = new Thread(() -> {
try {
countDownLatch.await();
System.out.println("数据上传任务完成");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
a.start();
b.start();
c.start();
}
}