java之并发工具类计数器(CountDownLatch)

别来无恙 提交于 2020-01-01 02:41:07

java并发工具类
1、CountDownLatch :能够使一个或多个线程等待其他线程完成各自的工作后再执行
2、CyclicBarrier : 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
3、Semaphore : 用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理地使用公共资源
4、Exchanger  : 用于线程间协作的工具类

1、CountDownLatch(倒计时 门栓):让一些线程阻塞直到另一些线程完成一系列操作后才唤醒。 
白话理解:比如一辆拉客面包车,车里能做5个人,司机等到5个都坐上来了才可以发车。
实现:它通过调用await方法让线程进入阻塞状态等待倒计时0时唤醒。
它通过线程调用countDown方法让倒计时中的计数器减去1,当计数器为0时,会唤醒哪些因为调用了await而阻塞的线程。
底层实现:
底层是使用AQS实现的

案列:假设老板开一个紧急会议,他先到会议室等着所有人签到然后开始开会,可以使用CountDownLatch进行模拟。

public static void main(String[] args) {
    CountDownLatch countDownLatch=new CountDownLatch(5);

    for (int i=1;i<=5;i++){
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"签到!");
            countDownLatch.countDown();
        },"第"+i+"个人").start();
    }


    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("老板宣布人够了开始开会!");
}

运行结果如下:

第1个人签到!
第2个人签到!
第5个人签到!
第4个人签到!
第3个人签到!
老板宣布人够了开始开会!


重点:当多线程并发情况下,如果有四个线程,前三个线程并发执行完才可以执行最后一个线程,那么可以使用CountDownLatch来实现

其他博客参考:https://www.cnblogs.com/wangsen/p/11170709.html

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!