激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java并發編程JUC CountDownLatch線程同步

java并發編程JUC CountDownLatch線程同步

2021-12-15 12:00字母哥博客 Java教程

這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來展開對java并發編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內容

java并發編程JUC CountDownLatch線程同步

java并發編程JUC CountDownLatch線程同步

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

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

1、CountDownLatch是什么?

CountDownLatch用線程數來初始化一個計數器,每當一個線程完成執行時,這個計數器就會遞減。當計數為零時,表示所有線程都已完成執行,處于等待狀態的主線程可以繼續執行。

java并發編程JUC CountDownLatch線程同步

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

  • 主線程啟動,并為N個線程(假設n=3)初始化CountDownLatch(n)
  • 啟動n個線程
  • 主線程阻塞等待
  • 線程1執行完成,CountDownLatch -1 = 2,主線程繼續阻塞
  • 線程3執行完成,CountDownLatch -1 = 1,主線程繼續阻塞
  • 線程4執行完成,CountDownLatch -1 = 0,主線程恢復執行

2、CountDownLatch 如何工作

CountDownLatch.java類里面定義了一個構造函數。count實質上是線程數,這個值只能設置一次,CountDownLatch沒有提供方法來重置這個數

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

使用CountDownLatch的主線程要去等待其他線程執行完成,所以這個主線程必須在啟動其他線程后立即調用 CountDownLatch.await() 方法,該方法阻塞主線程處于等待狀態,直到其他線程執行完畢,才會停止阻塞。

其他N個線程必須有CountDownLatch對象的引用,因為它們需要通知CountDownLatch對象它們已經完成任務。這個通知是由方法CountDownLatch.countDown()來完成的,每調用一次該方法,就會將構造函數中設置的初始計數count減少1,所以當所有N個線程都調用了這個方法后count計數達到0,主線程就可以不受await()方法阻塞恢復執行了。

所以CountDownLatch特別適合于那些需要等待N個線程完成后再開始執行的場景。例如一個應用程序的啟動類,在處理用戶請求之前,要確保所有N個外部系統都是處于運行狀態的。

3、CountDownLatch 代碼例子

假設我們的應用程序主線程啟動之前,要檢查另外4個程序是否準備就緒,只有其他的4個程序準備就緒,我們的主程序才能繼續執行。就可以使用下面的代碼來操作:

import java.util.concurrent.CountDownLatch;

public class Tester {
 public static void main(String args[]) {
    //設置計數器 counter = 4 ,等于線程數
    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));  

    // 啟動多線程去檢查其他四個程序的可用狀態
    app1.start();
    app2.start();
    app3.start();
    app4.start();

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

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

class Application implements Runnable {
 private String name; //應用程序名稱
 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計數器的值減1
    countDownLatch.countDown();    
 }
}

上述程序的打印輸出結果是,可以結合輸出結果去理解上文中講述的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.

到此這篇關于java并發編程JUC CountDownLatch線程同步的文章就介紹到這了,更多相關java JUC CountDownLatch線程同步內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/zimug/p/14899255.html

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 国产成人免费精品 | 一区二区久久精品66国产精品 | 97se亚洲综合在线韩国专区福利 | 成人国产免费观看 | 曰韩毛片 | 99这里有精品 | 毛片国产 | 黄色片免费看看 | 性欧美xxxx极品摘花 | 天天草天天爱 | 福利在线免费视频 | 亚洲一区二区在线 | 欧美精品在线免费观看 | 久久久久久久久久久久久国产精品 | 久久综合给合久久狠狠狠97色69 | 毛片毛片| 中文字幕亚洲视频 | 99国内精品视频 | 天天草天天干天天射 | 欧美日韩在线播放 | www.射| 丰满年轻岳中文字幕一区二区 | 蜜桃免费在线 | 久久久久久久久久久国产精品 | 欧美性生活网站 | 成人一区二区在线观看视频 | 成人羞羞视频在线观看免费 | 国产精品免费成人 | 一区二区久久 | 一区在线不卡 | 国产成人在线视频 | 成人偷拍片视频在线观看 | 毛片免费视频观看 | 日韩黄色影视 | 久久国产一二区 | 吾色视频 | 97风流梦电影 | 日日草夜夜草 | 福利在线免费 | 桥本有菜免费av一区二区三区 | 看国产精品|