CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类。
内部有一个计数器
- 计数器的操作是原子操作,即同时只能有一个线程去操作这个计数器。
- CountDownLatch通过构造函数传入计数器的初始化值
- 调用者可以通过调用CounDownLatch对象的cutDown()方法,来使计数减1
- 如果某线程调用了CountDownLatch对象上的await()方法,那么此调用线程将一直阻塞在这里,直到别的线程通过cutDown方法,将计数减到0,才可以继续执行
一个使用示例
我们假设在生产线上要生产一台电脑(由主板、显示器、内存、显卡、CPU、键盘、鼠标、机箱8个部分组成),电脑的各部件由不同的工作人员生产完成,最后在生产线上把各部件组装完成一台电脑
public class Worker implements Runnable {
private static final Random random = new Random();
private String spareParts;
private CountDownLatch countDownLatch;
public Worker(String spareParts,CountDownLatch countDownLatch){
this.spareParts = spareParts;
this.countDownLatch = countDownLatch;
}
public void run() {
try {
Thread.sleep(random.nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成部件["+spareParts+"]生产!!");
countDownLatch.countDown();
}
}
public class ProductionLine {
public static void main(String[] args) throws InterruptedException {
System.out.println("开始生产电脑......");
CountDownLatch countDownLatch = new CountDownLatch(8);
//主板、显示器、内存、显卡、CPU、键盘、鼠标、机箱
new Thread(new Worker("主板", countDownLatch)).start();
new Thread(new Worker("CPU", countDownLatch)).start();
new Thread(new Worker("内存", countDownLatch)).start();
new Thread(new Worker("显示器", countDownLatch)).start();
new Thread(new Worker("显卡", countDownLatch)).start();
new Thread(new Worker("电源", countDownLatch)).start();
new Thread(new Worker("键盘", countDownLatch)).start();
new Thread(new Worker("鼠标", countDownLatch)).start();
countDownLatch.await();//等待,直到所有的部件都生产出来
System.out.println("利用各个部件组装一台电脑,完成生产!!!");
}
}
结果输出
开始生产电脑......
完成部件[电源]生产!!
完成部件[显卡]生产!!
完成部件[显示器]生产!!
完成部件[CPU]生产!!
完成部件[主板]生产!!
完成部件[键盘]生产!!
完成部件[内存]生产!!
完成部件[鼠标]生产!!
利用各个部件组装一台电脑,完成生产!!!
在多线程协作工作时,当有线程需要等待其他线程完成某个操作,才能往下执行时就可以用到此类进行协调处理
网友评论