国产探花免费观看_亚洲丰满少妇自慰呻吟_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已收到所有響應結果


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙坪坝区| 铁力市| 梧州市| 边坝县| 乐业县| 罗山县| 璧山县| 乐平市| 高邮市| 南宫市| 碌曲县| 克拉玛依市| 中江县| 无锡市| 无极县| 茶陵县| 桐庐县| 菏泽市| 九龙城区| 新建县| 仪征市| 镇赉县| 潮安县| 工布江达县| 葫芦岛市| 建始县| 张家界市| 平遥县| 湾仔区| 渝北区| 当雄县| 遂宁市| 应用必备| 山西省| 宣威市| 沧州市| 东丽区| 苏尼特右旗| 韶关市| 肥东县| 义乌市|