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

java并發(fā)編程JUC CountDownLatch線程同步

 更新時(shí)間:2021年09月02日 17:02:20   作者:字母哥博客  
這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來(lái)展開對(duì)java并發(fā)編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內(nèi)容

java并發(fā)編程JUC CountDownLatch線程同步

CountDownLatch是一種線程同步輔助工具,它允許一個(gè)或多個(gè)線程等待其他線程正在執(zhí)行的一組操作完成。CountDownLatch的概念在java并發(fā)編程中非常常見,面試也會(huì)經(jīng)常被問到,所以一定要好好理解掌握。

CountDownLatch與其他并發(fā)編程工具類,如CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue等在java.util.concurrent包中與JDK 1.5一起被引入。CountDownLatch能讓一個(gè)java線程等待其他線程完成任務(wù),比如Application的主線程等待,直到其他負(fù)責(zé)啟動(dòng)框架服務(wù)的服務(wù)線程完成所有服務(wù)的啟動(dòng)。

1、CountDownLatch是什么?

CountDownLatch用線程數(shù)來(lái)初始化一個(gè)計(jì)數(shù)器,每當(dāng)一個(gè)線程完成執(zhí)行時(shí),這個(gè)計(jì)數(shù)器就會(huì)遞減。當(dāng)計(jì)數(shù)為零時(shí),表示所有線程都已完成執(zhí)行,處于等待狀態(tài)的主線程可以繼續(xù)執(zhí)行。

下面我們使用偽代碼的方式描述CountDownLatch 的作用

  • 主線程啟動(dòng),并為N個(gè)線程(假設(shè)n=3)初始化CountDownLatch(n)
  • 啟動(dòng)n個(gè)線程
  • 主線程阻塞等待
  • 線程1執(zhí)行完成,CountDownLatch -1 = 2,主線程繼續(xù)阻塞
  • 線程3執(zhí)行完成,CountDownLatch -1 = 1,主線程繼續(xù)阻塞
  • 線程4執(zhí)行完成,CountDownLatch -1 = 0,主線程恢復(fù)執(zhí)行

2、CountDownLatch 如何工作

CountDownLatch.java類里面定義了一個(gè)構(gòu)造函數(shù)。count實(shí)質(zhì)上是線程數(shù),這個(gè)值只能設(shè)置一次,CountDownLatch沒有提供方法來(lái)重置這個(gè)數(shù)

CountDownLatch.public CountDownLatch(int count) {...}

使用CountDownLatch的主線程要去等待其他線程執(zhí)行完成,所以這個(gè)主線程必須在啟動(dòng)其他線程后立即調(diào)用 CountDownLatch.await() 方法,該方法阻塞主線程處于等待狀態(tài),直到其他線程執(zhí)行完畢,才會(huì)停止阻塞。

其他N個(gè)線程必須有CountDownLatch對(duì)象的引用,因?yàn)樗鼈冃枰ㄖ狢ountDownLatch對(duì)象它們已經(jīng)完成任務(wù)。這個(gè)通知是由方法CountDownLatch.countDown()來(lái)完成的,每調(diào)用一次該方法,就會(huì)將構(gòu)造函數(shù)中設(shè)置的初始計(jì)數(shù)count減少1,所以當(dāng)所有N個(gè)線程都調(diào)用了這個(gè)方法后count計(jì)數(shù)達(dá)到0,主線程就可以不受await()方法阻塞恢復(fù)執(zhí)行了。

所以CountDownLatch特別適合于那些需要等待N個(gè)線程完成后再開始執(zhí)行的場(chǎng)景。例如一個(gè)應(yīng)用程序的啟動(dòng)類,在處理用戶請(qǐng)求之前,要確保所有N個(gè)外部系統(tǒng)都是處于運(yùn)行狀態(tài)的。

3、CountDownLatch 代碼例子

假設(shè)我們的應(yīng)用程序主線程啟動(dòng)之前,要檢查另外4個(gè)程序是否準(zhǔn)備就緒,只有其他的4個(gè)程序準(zhǔn)備就緒,我們的主程序才能繼續(xù)執(zhí)行。就可以使用下面的代碼來(lái)操作:

import java.util.concurrent.CountDownLatch;

public class Tester {
   public static void main(String args[]) {
      //設(shè)置計(jì)數(shù)器 counter = 4 ,等于線程數(shù)
      CountDownLatch countDownLatch = new CountDownLatch(4);

      Thread app1 = new Thread(new Application("App1",  countDownLatch));
      Thread app2 = new Thread(new Application("App2",  countDownLatch));          
      Thread app3 = new Thread(new Application("App3",  countDownLatch));
      Thread app4 = new Thread(new Application("App4",  countDownLatch));  
 
      // 啟動(dòng)多線程去檢查其他四個(gè)程序的可用狀態(tài)
      app1.start();
      app2.start();
      app3.start();
      app4.start();

      try {
         //主線程調(diào)用await進(jìn)行等待,等待上述四個(gè)線程正常完成
         countDownLatch.await();            
         //上述四個(gè)線程檢查的應(yīng)用程序啟動(dòng)正常之后, 打印如下信息
         System.out.println("All applications are up and running.");
      } catch(InterruptedException e) {
         System.out.println(e.getMessage());
      }        
   }
}

子線程程序,每一個(gè)線程都持有countDownLatch對(duì)象,線程正常執(zhí)行完成之時(shí),使用countDownLatch.countDown()方法將countDownLatch對(duì)象的計(jì)數(shù)器減1。

class Application implements Runnable {
   private String name; //應(yīng)用程序名稱
   private CountDownLatch countDownLatch; 

   public Application(String name, CountDownLatch countDownLatch) {
      this.name = name;
      this.countDownLatch = countDownLatch;
   }

   public void run() {
      try {
         System.out.println(name + " started. ");
         Thread.sleep(1000);
      } catch (InterruptedException e) {
         System.out.println(e.getMessage());
      }
      System.out.println( name + " is Up and running.");
      //將countDownLatch計(jì)數(shù)器的值減1
      countDownLatch.countDown();    
   }
}

上述程序的打印輸出結(jié)果是,可以結(jié)合輸出結(jié)果去理解上文中講述的CountDownLatch 工作原理:

App2 started.  
App3 started.  
App1 started.  
App4 started.  
App1 is Up and running.
App3 is Up and running.
App4 is Up and running.
App2 is Up and running.
All applications are up and running.

到此這篇關(guān)于java并發(fā)編程JUC CountDownLatch線程同步的文章就介紹到這了,更多相關(guān)java JUC CountDownLatch線程同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring注解和同步鎖不能同步問題解決

    Spring注解和同步鎖不能同步問題解決

    這篇文章主要介紹了Spring注解和同步鎖不能同步問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java While循環(huán) do-while循環(huán)用法

    Java While循環(huán) do-while循環(huán)用法

    循環(huán)語(yǔ)句就是讓計(jì)算機(jī)根據(jù)條件做循環(huán)計(jì)算,在條件滿足時(shí)繼續(xù)循環(huán),條件不滿足時(shí)退出循環(huán),需要的朋友可以參考下
    2020-11-11
  • 從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率

    從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率

    這篇文章主要介紹了從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • java中@JSONField和@JsonProperty注解的使用說(shuō)明及對(duì)比

    java中@JSONField和@JsonProperty注解的使用說(shuō)明及對(duì)比

    @JSONField與@JsonProperty隸屬兩個(gè)不同的包,前者是阿里系的fastjson包,后者是spring?boot官方使用的jackson包,本文主要介紹了java中@JSONField和@JsonProperty注解的使用說(shuō)明及對(duì)比,感興趣的可以了解一下
    2023-11-11
  • 在maven中引入本地jar包的步驟

    在maven中引入本地jar包的步驟

    這篇文章主要介紹了在maven中引入本地jar包的步驟,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Java程序員應(yīng)該遵守的10條紀(jì)律

    Java程序員應(yīng)該遵守的10條紀(jì)律

    Java程序員有許多應(yīng)遵循的守則或最佳實(shí)踐方式。本文概述了每個(gè)開發(fā)者最應(yīng)該遵循的10條守則或戒律,如果不遵循它們,將會(huì)導(dǎo)致災(zāi)難性后果。
    2015-09-09
  • SpringBoot多環(huán)境切換的配置實(shí)現(xiàn)

    SpringBoot多環(huán)境切換的配置實(shí)現(xiàn)

    在日常的開發(fā)中,一般都會(huì)分好幾種環(huán)境,本文就來(lái)介紹一下SpringBoot多環(huán)境切換的配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java如何自定義類數(shù)組的創(chuàng)建和初始化

    Java如何自定義類數(shù)組的創(chuàng)建和初始化

    這篇文章主要介紹了Java如何自定義類數(shù)組的創(chuàng)建和初始化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法

    Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java使用httpclient模擬post請(qǐng)求和get請(qǐng)求示例

    java使用httpclient模擬post請(qǐng)求和get請(qǐng)求示例

    這篇文章主要介紹了java使用httpclient模擬post請(qǐng)求和get請(qǐng)求示例,需要的朋友可以參考下
    2014-02-02

最新評(píng)論

定远县| 台州市| 五大连池市| 贵溪市| 鄂托克前旗| 临猗县| 建湖县| 茂名市| 沁阳市| 高唐县| 岳阳市| 桃源县| 修水县| 云和县| 永嘉县| 瑞昌市| 海宁市| 九台市| 天镇县| 嘉峪关市| 海盐县| 南昌市| 山阴县| 和静县| 江门市| 高平市| 三原县| 巴青县| 南部县| 图片| 琼结县| 英吉沙县| 巫溪县| 中宁县| 马山县| 彰化市| 沅江市| 九寨沟县| 永济市| 临沭县| 武隆县|