最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java多線程編程中CountDownLatch阻塞線程的方法

 更新時(shí)間:2016年07月13日 08:59:31   作者:skywangkw  
在Java中和ReadWriteLock.ReadLock一樣,CountDownLatch的本質(zhì)也是一個(gè)"共享鎖",這里我們就來(lái)詳解Java多線程編程中CountDownLatch阻塞線程的方法:

直譯過(guò)來(lái)就是倒計(jì)數(shù)(CountDown)門閂(Latch)。倒計(jì)數(shù)不用說(shuō),門閂的意思顧名思義就是阻止前進(jìn)。在這里就是指 CountDownLatch.await() 方法在倒計(jì)數(shù)為0之前會(huì)阻塞當(dāng)前線程。
CountDownLatch是一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。
CountDownLatch 的作用和 Thread.join() 方法類似,可用于一組線程和另外一組線程的協(xié)作。例如,主線程在做一項(xiàng)工作之前需要一系列的準(zhǔn)備工作,只有這些準(zhǔn)備工作都完成,主線程才能繼續(xù)它的工作。這些準(zhǔn)備工作彼此獨(dú)立,所以可以并發(fā)執(zhí)行以提高速度。在這個(gè)場(chǎng)景下就可以使用 CountDownLatch 協(xié)調(diào)線程之間的調(diào)度了。在直接創(chuàng)建線程的年代(Java 5.0 之前),我們可以使用 Thread.join()。在 JUC 出現(xiàn)后,因?yàn)榫€程池中的線程不能直接被引用,所以就必須使用 CountDownLatch 了。
CountDownLatch類是一個(gè)同步計(jì)數(shù)器,構(gòu)造時(shí)傳入int參數(shù),該參數(shù)就是計(jì)數(shù)器的初始值,每調(diào)用一次countDown()方法,計(jì)數(shù)器減1,計(jì)數(shù)器大于0 時(shí),await()方法會(huì)阻塞程序繼續(xù)執(zhí)行。 CountDownLatch可以看作是一個(gè)倒計(jì)數(shù)的鎖存器,當(dāng)計(jì)數(shù)減至0時(shí)觸發(fā)特定的事件。利用這種特性,可以讓主線程等待子線程的結(jié)束。 下面以一個(gè)模擬運(yùn)動(dòng)員比賽的例子加以說(shuō)明。
CountDownLatch的一個(gè)非常典型的應(yīng)用場(chǎng)景是:有一個(gè)任務(wù)想要往下執(zhí)行,但必須要等到其他的任務(wù)執(zhí)行完畢后才可以繼續(xù)往下執(zhí)行。假如我們這個(gè)想要繼續(xù)往下執(zhí)行的任務(wù)調(diào)用一個(gè)CountDownLatch對(duì)象的await()方法,其他的任務(wù)執(zhí)行完自己的任務(wù)后調(diào)用同一個(gè)CountDownLatch對(duì)象上的countDown()方法,這個(gè)調(diào)用await()方法的任務(wù)將一直阻塞等待,直到這個(gè)CountDownLatch對(duì)象的計(jì)數(shù)值減到0為止。

CountDownLatch函數(shù)列表

CountDownLatch(int count)
構(gòu)造一個(gè)用給定計(jì)數(shù)初始化的 CountDownLatch。
// 使當(dāng)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線程被中斷。
void await()
// 使當(dāng)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線程被中斷或超出了指定的等待時(shí)間。
boolean await(long timeout, TimeUnit unit)
// 遞減鎖存器的計(jì)數(shù),如果計(jì)數(shù)到達(dá)零,則釋放所有等待的線程。
void countDown()
// 返回當(dāng)前計(jì)數(shù)。
long getCount()
// 返回標(biāo)識(shí)此鎖存器及其狀態(tài)的字符串。
String toString()

CountDownLatch數(shù)據(jù)結(jié)構(gòu)
CountDownLatch的UML類圖如下:

201671385520115.jpg (292×140)

CountDownLatch的數(shù)據(jù)結(jié)構(gòu)很簡(jiǎn)單,它是通過(guò)"共享鎖"實(shí)現(xiàn)的。它包含了sync對(duì)象,sync是Sync類型。Sync是實(shí)例類,它繼承于AQS。


CountDownLatch的使用示例
下面通過(guò)CountDownLatch實(shí)現(xiàn):"主線程"等待"5個(gè)子線程"全部都完成"指定的工作(休眠1000ms)"之后,再繼續(xù)運(yùn)行。

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

public class CountDownLatchTest1 {

 private static int LATCH_SIZE = 5;
 private static CountDownLatch doneSignal;
 public static void main(String[] args) {

  try {
   doneSignal = new CountDownLatch(LATCH_SIZE);

   // 新建5個(gè)任務(wù)
   for(int i=0; i<LATCH_SIZE; i++)
    new InnerThread().start();

   System.out.println("main await begin.");
   // "主線程"等待線程池中5個(gè)任務(wù)的完成
   doneSignal.await();

   System.out.println("main await finished.");
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }

 static class InnerThread extends Thread{
  public void run() {
   try {
    Thread.sleep(1000);
    System.out.println(Thread.currentThread().getName() + " sleep 1000ms.");
    // 將CountDownLatch的數(shù)值減1
    doneSignal.countDown();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

運(yùn)行結(jié)果:

main await begin.
Thread-0 sleep 1000ms.
Thread-2 sleep 1000ms.
Thread-1 sleep 1000ms.
Thread-4 sleep 1000ms.
Thread-3 sleep 1000ms.
main await finished.

結(jié)果說(shuō)明:主線程通過(guò)doneSignal.await()等待其它線程將doneSignal遞減至0。其它的5個(gè)InnerThread線程,每一個(gè)都通過(guò)doneSignal.countDown()將doneSignal的值減1;當(dāng)doneSignal為0時(shí),main被喚醒后繼續(xù)執(zhí)行。

PS:CountDownLatch和CyclicBarrier的區(qū)別:
(1) CountDownLatch的作用是允許1或N個(gè)線程等待其他線程完成執(zhí)行;而CyclicBarrier則是允許N個(gè)線程相互等待。
(2) CountDownLatch的計(jì)數(shù)器無(wú)法被重置;CyclicBarrier的計(jì)數(shù)器可以被重置后使用,因此它被稱為是循環(huán)的barrier。

相關(guān)文章

  • Java線程安全的計(jì)數(shù)器簡(jiǎn)單實(shí)現(xiàn)代碼示例

    Java線程安全的計(jì)數(shù)器簡(jiǎn)單實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了Java線程安全的計(jì)數(shù)器簡(jiǎn)單實(shí)現(xiàn)代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 詳解5種Java中常見(jiàn)限流算法

    詳解5種Java中常見(jiàn)限流算法

    在高并發(fā)系統(tǒng)中,出于系統(tǒng)保護(hù)角度考慮,通常會(huì)對(duì)流量進(jìn)行限流;不但在工作中要頻繁使用,而且也是面試中的高頻考點(diǎn)。本文就為大家整理了5種Java中常見(jiàn)限流算法,需要的可以參考一下
    2023-04-04
  • SpringBoot設(shè)置首頁(yè)(默認(rèn)頁(yè))跳轉(zhuǎn)功能的實(shí)現(xiàn)方案

    SpringBoot設(shè)置首頁(yè)(默認(rèn)頁(yè))跳轉(zhuǎn)功能的實(shí)現(xiàn)方案

    這篇文章主要介紹了SpringBoot設(shè)置首頁(yè)(默認(rèn)頁(yè))跳轉(zhuǎn)功能,本文通過(guò)兩種方案,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot整合Spring?Data?JPA的詳細(xì)方法

    SpringBoot整合Spring?Data?JPA的詳細(xì)方法

    JPA全稱為Java Persistence API(Java持久層API),是一個(gè)基于ORM的標(biāo)準(zhǔn)規(guī)范,在這個(gè)規(guī)范中,JPA只定義標(biāo)準(zhǔn)規(guī)則,不提供實(shí)現(xiàn),本文重點(diǎn)給大家介紹SpringBoot整合Spring?Data?JPA的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-02-02
  • SpringBoot2.3新特性優(yōu)雅停機(jī)詳解

    SpringBoot2.3新特性優(yōu)雅停機(jī)詳解

    這篇文章主要介紹了SpringBoot2.3新特性優(yōu)雅停機(jī)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決

    Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決

    這篇文章主要介紹了Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決,文中所介紹的兩種使用過(guò)濾器解決中文鏈接亂碼的方法非常有效,需要的朋友可以參考下
    2016-02-02
  • Java定義棧結(jié)構(gòu),并實(shí)現(xiàn)入棧、出棧操作完整示例

    Java定義棧結(jié)構(gòu),并實(shí)現(xiàn)入棧、出棧操作完整示例

    這篇文章主要介紹了Java定義棧結(jié)構(gòu),并實(shí)現(xiàn)入棧、出棧操作,結(jié)合完整實(shí)例形式分析了java數(shù)據(jù)結(jié)構(gòu)中棧的定義、以及入棧、出棧、棧是否為空判斷、棧大小計(jì)算、打印棧元素等相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理

    SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理

    這篇文章主要介紹了SpringBoot使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring?Bean是如何初始化的詳解

    Spring?Bean是如何初始化的詳解

    Spring只Bean加載機(jī)制默認(rèn)情況下是初始化容器的時(shí)候就會(huì)直接初始化,但是也取決于是否使用了懶加載,下面這篇文章主要給大家介紹了關(guān)于Spring?Bean是如何初始化的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器

    java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器

    這篇文章主要介紹了 java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

利津县| 通化县| 铅山县| 麻栗坡县| 吴桥县| 牙克石市| 阆中市| 确山县| 麻城市| 五莲县| 敦化市| 乌鲁木齐县| 游戏| 日喀则市| 锦屏县| 兴义市| 甘德县| 万宁市| 红桥区| 平邑县| 全州县| 新竹市| 治县。| 聂拉木县| 明光市| 津南区| 娄烦县| 清丰县| 昭觉县| 黑龙江省| 防城港市| 汾阳市| 合水县| 安阳市| 德兴市| 陆川县| 米林县| 雷州市| 临沭县| 郑州市| 嘉定区|