国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java多線程編程之CountDownLatch同步工具使用實例

2019-11-26 15:11:44
字體:
來源:轉載
供稿:網友

好像倒計時計數器,調用CountDownLatch對象的countDown方法就將計數器減1,當到達0時,所有等待者就開始執行。

java.util.concurrent.CountDownLatch
一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。用給定的計數初始化CountDownLatch。由于調用了countDown()方法,所以在當前計數到達零之前,await方法會一直受阻塞。之后,會釋放所有等待的線程,await的所有后續調用都將立即返回。這種現象只出現一次――計數無法被重置。如果需要重置計數,請考慮使用CyclicBarrier。

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

CountDownLatch的一個有用特性是,它不要求調用countDown方法的線程等到計數到達零時才繼續,而在所有線程都能通過之前,它只是阻止任何線程繼續通過一個await。

舉例:多個運動員等待裁判命令:裁判等所有運動員到齊后發布結果

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();    //裁判發布命令的計數器,計數器為0,運動員就跑    final CountDownLatch cdOrder = new CountDownLatch(1);    //運動員跑到終點的計數器,為0裁判宣布結果    final CountDownLatch cdAnswer = new CountDownLatch(3);          //產生3個運動員    for(int i=0;i<3;i++){      Runnable runnable = new Runnable(){          public void run(){          try {            System.out.println("線程" + Thread.currentThread().getName() + "正準備接受命令");                        cdOrder.await();            System.out.println("線程" + Thread.currentThread().getName() + "已接受命令");                           Thread.sleep((long)(Math.random()*10000));             System.out.println("線程" + Thread.currentThread().getName() + "回應命令處理結果");                       cdAnswer.countDown();                     } catch (Exception e) {            e.printStackTrace();          }               }      };      service.execute(runnable); //運動員開始任務    }                 try {      //裁判休息一會 再發布命令      Thread.sleep((long)(Math.random()*10000));           System.out.println("線程" + Thread.currentThread().getName() + "即將發布命令");                cdOrder.countDown(); //命令計數器置為0,發布命令      System.out.println("線程" + Thread.currentThread().getName() + "已發送命令,正在等待結果");       cdAnswer.await(); //等待所有運動員,計數器為0 所有運動員到位      System.out.println("線程" + Thread.currentThread().getName() + "已收到所有響應結果");     } catch (Exception e) {      e.printStackTrace();    }           service.shutdown();   }}

返回結果:

線程pool-1-thread-3正準備接受命令線程pool-1-thread-1正準備接受命令線程pool-1-thread-2正準備接受命令線程main即將發布命令線程main已發送命令,正在等待結果線程pool-1-thread-2已接受命令線程pool-1-thread-1已接受命令線程pool-1-thread-3已接受命令線程pool-1-thread-3回應命令處理結果線程pool-1-thread-2回應命令處理結果線程pool-1-thread-1回應命令處理結果線程main已收到所有響應結果


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗定市| 古交市| 玛曲县| 航空| 高陵县| 德阳市| 武邑县| 绥阳县| 呼和浩特市| 平阳县| 拜泉县| 诏安县| 洪江市| 武山县| 江永县| 南通市| 九江市| 苏尼特左旗| 葵青区| 田阳县| SHOW| 苏尼特左旗| 毕节市| 措勤县| 平远县| 繁峙县| 石屏县| 柏乡县| 和林格尔县| 绿春县| 长沙市| 潼关县| 西和县| 玉屏| 游戏| 雷波县| 铜川市| 巧家县| 东城区| 收藏| 收藏|