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

Java多線程編程之CountDownLatch同步工具使用實(shí)例

 更新時(shí)間:2015年05月19日 10:12:24   投稿:junjie  
這篇文章主要介紹了Java多線程編程之CountDownLatch同步工具使用實(shí)例,需要的朋友可以參考下

好像倒計(jì)時(shí)計(jì)數(shù)器,調(diào)用CountDownLatch對(duì)象的countDown方法就將計(jì)數(shù)器減1,當(dāng)?shù)竭_(dá)0時(shí),所有等待者就開始執(zhí)行。

java.util.concurrent.CountDownLatch
一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。用給定的計(jì)數(shù)初始化CountDownLatch。由于調(diào)用了countDown()方法,所以在當(dāng)前計(jì)數(shù)到達(dá)零之前,await方法會(huì)一直受阻塞。之后,會(huì)釋放所有等待的線程,await的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次——計(jì)數(shù)無(wú)法被重置。如果需要重置計(jì)數(shù),請(qǐng)考慮使用CyclicBarrier。

CountDownLatch是一個(gè)通用同步工具,它有很多用途。將計(jì)數(shù)1初始化的CountDownLatch用作一個(gè)簡(jiǎn)單的開/關(guān)鎖存器,或入口:在通過調(diào)用countDown()的線程打開入口前,所有調(diào)用await的線程都一直在入口處等待。用N初始化的 CountDownLatch可以使一個(gè)線程在N個(gè)線程完成某項(xiàng)操作之前一直等待,或者使其在某項(xiàng)操作完成N次之前一直等待。

CountDownLatch的一個(gè)有用特性是,它不要求調(diào)用countDown方法的線程等到計(jì)數(shù)到達(dá)零時(shí)才繼續(xù),而在所有線程都能通過之前,它只是阻止任何線程繼續(xù)通過一個(gè)await。

舉例:多個(gè)運(yùn)動(dòng)員等待裁判命令:裁判等所有運(yùn)動(dòng)員到齊后發(fā)布結(jié)果

package com.ljq.test.thread;
 
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class CountdownLatchTest {
 
  public static void main(String[] args) {
    ExecutorService service = Executors.newCachedThreadPool();
    //裁判發(fā)布命令的計(jì)數(shù)器,計(jì)數(shù)器為0,運(yùn)動(dòng)員就跑
    final CountDownLatch cdOrder = new CountDownLatch(1);
    //運(yùn)動(dòng)員跑到終點(diǎn)的計(jì)數(shù)器,為0裁判宣布結(jié)果
    final CountDownLatch cdAnswer = new CountDownLatch(3); 
     
    //產(chǎn)生3個(gè)運(yùn)動(dòng)員
    for(int i=0;i<3;i++){
      Runnable runnable = new Runnable(){
          public void run(){
          try {
            System.out.println("線程" + Thread.currentThread().getName() + "正準(zhǔn)備接受命令");            
            cdOrder.await();
            System.out.println("線程" + Thread.currentThread().getName() + "已接受命令");               
            Thread.sleep((long)(Math.random()*10000)); 
            System.out.println("線程" + Thread.currentThread().getName() + "回應(yīng)命令處理結(jié)果");           
            cdAnswer.countDown();           
          } catch (Exception e) {
            e.printStackTrace();
          }       
        }
      };
      service.execute(runnable); //運(yùn)動(dòng)員開始任務(wù)
    }   
     
     
    try {
      //裁判休息一會(huì) 再發(fā)布命令
      Thread.sleep((long)(Math.random()*10000));
     
      System.out.println("線程" + Thread.currentThread().getName() + "即將發(fā)布命令");          
      cdOrder.countDown(); //命令計(jì)數(shù)器置為0,發(fā)布命令
      System.out.println("線程" + Thread.currentThread().getName() + "已發(fā)送命令,正在等待結(jié)果"); 
      cdAnswer.await(); //等待所有運(yùn)動(dòng)員,計(jì)數(shù)器為0 所有運(yùn)動(dòng)員到位
      System.out.println("線程" + Thread.currentThread().getName() + "已收到所有響應(yīng)結(jié)果"); 
    } catch (Exception e) {
      e.printStackTrace();
    }       
    service.shutdown();
 
  }
}

返回結(jié)果:

線程pool-1-thread-3正準(zhǔn)備接受命令
線程pool-1-thread-1正準(zhǔn)備接受命令
線程pool-1-thread-2正準(zhǔn)備接受命令
線程main即將發(fā)布命令
線程main已發(fā)送命令,正在等待結(jié)果
線程pool-1-thread-2已接受命令
線程pool-1-thread-1已接受命令
線程pool-1-thread-3已接受命令
線程pool-1-thread-3回應(yīng)命令處理結(jié)果
線程pool-1-thread-2回應(yīng)命令處理結(jié)果
線程pool-1-thread-1回應(yīng)命令處理結(jié)果
線程main已收到所有響應(yīng)結(jié)果


相關(guān)文章

  • 關(guān)于接口ApplicationContext中的getBean()方法使用

    關(guān)于接口ApplicationContext中的getBean()方法使用

    這篇文章主要介紹了關(guān)于接口ApplicationContext中的getBean()方法使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • java語(yǔ)言實(shí)現(xiàn)權(quán)重隨機(jī)算法完整實(shí)例

    java語(yǔ)言實(shí)現(xiàn)權(quán)重隨機(jī)算法完整實(shí)例

    這篇文章主要介紹了java語(yǔ)言實(shí)現(xiàn)權(quán)重隨機(jī)算法完整實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • idea 自動(dòng)生成類注釋和方法注釋的實(shí)現(xiàn)步驟

    idea 自動(dòng)生成類注釋和方法注釋的實(shí)現(xiàn)步驟

    這篇文章主要介紹了idea 自動(dòng)生成類注釋和方法注釋的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java項(xiàng)目中classpath類路徑是什么

    Java項(xiàng)目中classpath類路徑是什么

    classpath指的是類路徑,也就是編譯之后的target文件夾下的WEB-INF/class文件夾,下面這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目中classpath類路徑是什么的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • java開發(fā)實(shí)現(xiàn)五子棋游戲

    java開發(fā)實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java開發(fā)實(shí)現(xiàn)五子棋游戲,具有雙人對(duì)戰(zhàn)和人機(jī)對(duì)戰(zhàn)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • idea中的update?project按鈕使用

    idea中的update?project按鈕使用

    這篇文章主要介紹了idea中的update?project按鈕使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 深入理解java long 存儲(chǔ)時(shí)間戳

    深入理解java long 存儲(chǔ)時(shí)間戳

    存儲(chǔ)時(shí)間打算用時(shí)間戳來(lái)存儲(chǔ),打算用long類型來(lái)代表時(shí)間戳,這篇文章主要介紹了深入理解java long 存儲(chǔ)時(shí)間戳,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 誤將.idea文件提交至git后刪除的操作方法

    誤將.idea文件提交至git后刪除的操作方法

    這篇文章主要介紹了誤將.idea文件提交至git后刪除的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springboot集成redis實(shí)現(xiàn)消息的訂閱與發(fā)布

    springboot集成redis實(shí)現(xiàn)消息的訂閱與發(fā)布

    本文主要介紹了springboot集成redis實(shí)現(xiàn)消息的訂閱與發(fā)布,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法

    Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

湛江市| 阜平县| 南丹县| 东丰县| 县级市| 布尔津县| 章丘市| 宣汉县| 保山市| 宣汉县| 文成县| 辽宁省| 天津市| 镇雄县| 汉沽区| 舞阳县| 包头市| 丹凤县| 修水县| 偏关县| 连平县| 巢湖市| 尼玛县| 虹口区| 临桂县| 加查县| 永顺县| 通州区| 建宁县| 临澧县| 漯河市| 定远县| 新邵县| 泉州市| 孟村| 司法| 报价| 奇台县| 深水埗区| 秦安县| 秭归县|