CountDownLatch 介绍与举例实现
生活随笔
收集整理的這篇文章主要介紹了
CountDownLatch 介绍与举例实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 概述
- 主要方法
- 舉例實(shí)現(xiàn)
概述
CountDownLatch 是 JUC 包下的一個(gè)重要的并發(fā)工具,它是一個(gè)線程協(xié)同作業(yè)的工具,使某些線程一直處于等待狀態(tài),直到另外的線程完成任務(wù)后再執(zhí)行。
主要方法
CountDownLatch 主要靠?jī)?nèi)部的一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)同步功能,其過(guò)程具有不可重復(fù)性。
- countDown() 方法:計(jì)數(shù)器的值 -1。
- getCount() 方法:獲取當(dāng)前計(jì)數(shù)器的值。
- await() 方法:當(dāng)計(jì)數(shù)器的值不為 0 時(shí),將阻塞所有調(diào)用此方法的線程,一直到計(jì)數(shù)器的值為 0 時(shí),才會(huì)喚醒所有被此 CountDownLatch 對(duì)象阻塞的線程。
- await(long timeout, TimeUnit unit) 方法:在 await() 方法的基礎(chǔ)上,增加了超時(shí)時(shí)間,以及增加了 boolean 類型的返回值。
- 當(dāng) timeout 的值小于或等于 0 時(shí),將不會(huì)等待,若此時(shí)計(jì)數(shù)器的值為 0 ,則返回 true,否則返回 false。
- 當(dāng)計(jì)數(shù)器在超時(shí)時(shí)間內(nèi),值歸 0 了,則會(huì)正常返回 true,并執(zhí)行喚醒操作。
- 當(dāng)超過(guò)了這個(gè)超時(shí)時(shí)間,計(jì)數(shù)器的值還未歸 0,則會(huì)返回 false,也會(huì)執(zhí)行喚醒操作。
舉例實(shí)現(xiàn)
現(xiàn)有代碼如下:
static class MyRunnable implements Runnable {private int id;private CountDownLatch countDownLatch;public MyRunnable(int id, CountDownLatch countDownLatch) {this.id = id;this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println("線程 :"+id+"正在執(zhí)行......");try {Thread.sleep((int)(2000+(Math.random()*1000)));}catch (Exception ignored) {}countDownLatch.countDown();System.out.println("線程 :"+id+"執(zhí)行結(jié)束!!!!!!");}}static class Runnable1 implements Runnable {private CountDownLatch countDownLatch;public Runnable1(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println("線程 Runnable 1 開始執(zhí)行, 需要等到 CountDownLatch 的計(jì)數(shù)為0時(shí)才會(huì)執(zhí)行下一步操作");try {countDownLatch.await();System.out.println("線程 Runnable 1 終于執(zhí)行完畢, 此時(shí) CountDownLatch 中的計(jì)數(shù)為: "+countDownLatch.getCount());} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(5);new Thread(new Runnable1(countDownLatch)).start();for (int i = 0;i<5;i++) {new Thread(new MyRunnable(i, countDownLatch)).start();}countDownLatch.await();System.out.println("全部線程執(zhí)行結(jié)束, 現(xiàn)在主線程可以開始執(zhí)行下一步操作, 此時(shí) CountDownLatch 中的計(jì)數(shù)為: "+countDownLatch.getCount());}代碼運(yùn)行結(jié)果為:
線程 Runnable 1 開始執(zhí)行, 需要等到 CountDownLatch 的計(jì)數(shù)為0時(shí)才會(huì)執(zhí)行下一步操作 線程 :0正在執(zhí)行...... 線程 :2正在執(zhí)行...... 線程 :3正在執(zhí)行...... 線程 :4正在執(zhí)行...... 線程 :1正在執(zhí)行...... 線程 :3執(zhí)行結(jié)束!!!!!! 線程 :2執(zhí)行結(jié)束!!!!!! 線程 :1執(zhí)行結(jié)束!!!!!! 線程 :0執(zhí)行結(jié)束!!!!!! 線程 :4執(zhí)行結(jié)束!!!!!! 線程 Runnable 1 終于執(zhí)行完畢, 此時(shí) CountDownLatch 中的計(jì)數(shù)為: 0 全部線程執(zhí)行結(jié)束, 現(xiàn)在主線程可以開始執(zhí)行下一步操作, 此時(shí) CountDownLatch 中的計(jì)數(shù)為: 0可以看到,Runnable1 中的 run() 方法中的第一行打印語(yǔ)句最先執(zhí)行,隨后調(diào)用 countDownLatch.await() 方法后即被阻塞 ,其后一直等到所有的 MyRunnable 線程都執(zhí)行結(jié)束后(即 CountDownLatch 的內(nèi)部計(jì)數(shù)器值為 0 時(shí)),第二行打印語(yǔ)句才被執(zhí)行。主線程中的打印語(yǔ)句亦如此。
總結(jié)
以上是生活随笔為你收集整理的CountDownLatch 介绍与举例实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 空中最亮的星用计算机弹数字,赤峰——夜空
- 下一篇: 浅谈C/C++引用和指针的联系和区别