CountDownLatch--倒计数器

1、引入CountDownLatch

CountDownLatch是一个非常实用的多线程控制工具类。这个工具类通常用来控制线程等待,它可以让某一个线程等待直到倒计数结束,再开始执行。

对于到计数器,一种典型的场景就是火箭发射。在火箭发射前,为了保证万无一失,往往还要进行各项设备、仪器的检查。只有等待所有的检查完毕后,引擎才能点火。这种场景就非常适合使用CountDownLatch。它可以使得点火线程等待所有检查线程全部完工后,再执行。

CountDownLatch的构造函数接收一个整数作为参数,即当前这个计数器的计数个数。

public CountDownLatch(int count)

2、CountDownLatch的主要逻辑方法

public void await() throws InterruptedException
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
public void countDown()
public long getCount()
  • await()方法:让当前线程进行等待,直到的CountDownLatch计数值变为0,或者当前线程被中断。
  • await(long timeout, TimeUnit unit)方法:让当前线程进行等待,直到的计数值变为0,或者等待时间用完,或者当前线程被中断。
  • countDown()方法:减少CountDownLatch计数值,如果计数达到零则释放所有等待的线程。
  • getCount():返回当前CountDownLatch的计数值。

3、简单演示CountDownLatch的使用CountDownLatch

演示代码如下:

public class CountDownLatchDemo implements Runnable
{
    static final CountDownLatch end = new CountDownLatch(10);
    static final CountDownLatchDemo demo = new CountDownLatchDemo();


    @Override
    public void run()
    {
        try
        {
            //模拟检查任务
            Thread.sleep(new Random().nextInt(10) * 1000);
            System.out.println("check complete");
            //通知CountDownLatch一个线程已经完成了任务。倒计数器可以减1了
            end.countDown();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException
    {
        ExecutorService exec = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; ++i)
        {
            exec.submit(demo);
        }

        //等待检查,要求主线程等待所有检查任务全部完成
        end.await();
        //发射火箭
        System.out.println("Fire");
        exec.shutdown();
    }
}

上述代码中生成一个CountDownLatch实例,计数数量为10.这表示需要有10个线程完成任务,等待在CountDownLatch上的线程才能继续执行。其中 end.countDown()调用CountDownLatch的countdown()方法,也就是通知CountDownLatch,一个线程已经完成任务,倒计数器可以减1了。其中 end.await()调用CountDownLatch的await()方法,要求主线程等待所有10个检查任务全部完成。待10个任务全部完成后,主线程才能继续执行。

总的来说就是主线程在CountDownLatch上等待,当所有检查任务全部完成后,主线程方能继续执行

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 此篇博客所有源码均来自JDK 1.8 在上篇博客中介绍了Java四大并发工具之一的CyclicBarrier,今天...
    chenssy阅读 2,884评论 2 27
  • CountDownLatch 介绍 CountDownLatch是一个同步协助类,允许一个或多个线程等待,直到其他...
    tomas家的小拨浪鼓阅读 3,121评论 0 9
  • 上周遇到了截取图片部分不清晰的问题,一开始以为是后台返回的图片不清晰就没去理会(之前忙着开发新功能没时间),上周五...
    于桁阅读 2,779评论 1 2
  • 我不知道为什么会遇到你。 更不知道为什么遇到的会是你。 总之我是遇到了, 在那个春光明媚的街角。 我和你走过了春夏...
    MrEricLiu阅读 348评论 1 0
  • 刚才碍于宴席,不能写,来到家,吹着凉风,却又找不到写点。说到军人军事,在微信,我是关注了好几个公众号,每天先看军评...
    f504d92cceb4阅读 458评论 0 1