欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

1、CountDownLatch是什么?

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

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

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

2、CountDownLatch 如何工作

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

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

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

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

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

3、CountDownLatch 代碼例子

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

import java.util.concurrent.CountDownLatch;

public class Tester {
   public static void main(String args[]) {
      //設(shè)置計數(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));  
 
      // 啟動多線程去檢查其他四個程序的可用狀態(tài)
      app1.start();
      app2.start();
      app3.start();
      app4.start();

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

子線程程序,每一個線程都持有countDownLatch對象,線程正常執(zhí)行完成之時,使用countDownLatch.countDown()方法將countDownLatch對象的計數(shù)器減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計數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 輕松理解Java面試和開發(fā)中的IoC(控制反轉(zhuǎn))

    輕松理解Java面試和開發(fā)中的IoC(控制反轉(zhuǎn))

    在Java開發(fā)中,IoC意 味著將你設(shè)計好的類交給系統(tǒng)去控制,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)。下文給大家介紹Java面試和開發(fā)中的IoC(控制反轉(zhuǎn))知識,需要的朋友參考下吧
    2017-07-07
  • 使用ServletInputStream在攔截器或過濾器中應用后重寫

    使用ServletInputStream在攔截器或過濾器中應用后重寫

    這篇文章主要介紹了使用ServletInputStream在攔截器或過濾器中應用后重寫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Springboot?通過FastJson實現(xiàn)bean對象和Json字符串互轉(zhuǎn)問題

    Springboot?通過FastJson實現(xiàn)bean對象和Json字符串互轉(zhuǎn)問題

    這篇文章主要介紹了Springboot?通過FastJson實現(xiàn)bean對象和Json字符串互轉(zhuǎn),本文嘗試驗證兩種場景給大家詳細介紹,對Springboot?FastJson實現(xiàn)bean和Json互轉(zhuǎn)問題,感興趣的朋友一起看看吧
    2022-08-08
  • 使用Idea連接MySQL的詳細步驟總結(jié)

    使用Idea連接MySQL的詳細步驟總結(jié)

    今天給大家?guī)淼氖顷P(guān)于IDEA連接數(shù)據(jù)庫的問題,文章圍繞著使用Idea連接MySQL的詳細步驟展開,文中有非常詳細的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06
  • MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法

    MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法

    這篇文章主要介紹了MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 自定義注解實現(xiàn)Spring容器注入Bean方式(類似于mybatis的@MapperScans)

    自定義注解實現(xiàn)Spring容器注入Bean方式(類似于mybatis的@MapperScans)

    本文介紹了如何通過自定義注解@MyService和@MyServiceScans在SpringBoot項目中自動將指定包下的類注入Spring容器,詳細解釋了創(chuàng)建自定義注解、定義包掃描器ClassPathBeanDefinitionScanner的作用與實現(xiàn)
    2024-09-09
  • 關(guān)于mybatis3中幾個@Provider的使用方式

    關(guān)于mybatis3中幾個@Provider的使用方式

    這篇文章主要介紹了關(guān)于mybatis3中幾個@Provider的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring?Kafka中如何通過參數(shù)配置解決超時問題詳解

    Spring?Kafka中如何通過參數(shù)配置解決超時問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Kafka中如何通過參數(shù)配置解決超時問題的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • Java 中的變量類型

    Java 中的變量類型

    這篇文章主要介紹了Java 中的變量類型,一般包括局部變量、成員變量、類變量,下面文章對這三種內(nèi)容的變量做了一個詳細介紹,需要的朋友可以參考一下
    2021-11-11
  • 使用@PathVariable注解如何實現(xiàn)動態(tài)傳值

    使用@PathVariable注解如何實現(xiàn)動態(tài)傳值

    這篇文章主要介紹了使用@PathVariable注解如何實現(xiàn)動態(tài)傳值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論