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

基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明

 更新時(shí)間:2020年09月29日 08:42:20   作者:xqnode  
這篇文章主要介紹了基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

2018.12.12更新

在學(xué)習(xí)了CyclicBarrier之后發(fā)現(xiàn),CyclicBarrier也可以實(shí)現(xiàn)跟CountDownLatch類似的功能,只需要在它的parties中多設(shè)置一個(gè)數(shù),將主線程加入等待隊(duì)列就可以了:

public static void main(String[] args) {
  ExecutorService pool = Executors.newCachedThreadPool();
  int size = 3;
  // 設(shè)置參數(shù)時(shí),線程實(shí)際執(zhí)行數(shù)size+1,將main線程也加到等待隊(duì)列中
  CyclicBarrier cyclicBarrier = new CyclicBarrier(size + 1);
  for (int i = 0; i < size; i++) {
   int index = i;
   pool.submit(() -> {
    try {
     TimeUnit.SECONDS.sleep(index);
     System.out.println("第" + index + "位運(yùn)動(dòng)員準(zhǔn)備好了");
     cyclicBarrier.await();
    } catch (Exception e) {
     e.printStackTrace();
    }
   });
  }
  try {
  //主線程也加入等待
   cyclicBarrier.await();
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.out.println(size + "位運(yùn)動(dòng)員都準(zhǔn)備好了,可以起跑!");
 }

執(zhí)行結(jié)果:

以下是原內(nèi)容:

我在使用并發(fā)線程?hào)艡诘臅r(shí)候發(fā)現(xiàn)了兩種,分別是CyclicBarrier 和CountDownLatch。對(duì)于兩者的對(duì)比的文章有很多,這里不再贅述。我來(lái)說(shuō)下我的使用過(guò)程。

**需求:**有三位運(yùn)動(dòng)員,他們一起參加萬(wàn)米賽跑,但是他們準(zhǔn)備的時(shí)間不同,要等他們都準(zhǔn)備好了再開始一起跑。

使用CyclicBarrier 實(shí)現(xiàn):

import java.util.concurrent.*;

public class RunTest {
 public static void main(String[] args) {
  ExecutorService pool = Executors.newCachedThreadPool();
  int size = 3;
  CyclicBarrier cyclicBarrier = new CyclicBarrier(size, () -> {
   System.out.println(size + "位運(yùn)動(dòng)員都準(zhǔn)備好了,可以起跑!");
   pool.shutdownNow();
  });

  for (int i = 0; i < size; i++) {
   int index = i;
   pool.submit(() -> {
    try {
     TimeUnit.SECONDS.sleep(index);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    System.out.println("第" + index + "位運(yùn)動(dòng)員準(zhǔn)備好了");
    try {
     cyclicBarrier.await();
    } catch (InterruptedException | BrokenBarrierException e) {
     e.printStackTrace();
    }
   });
  }
 }
}

結(jié)果:

可以看到,三位運(yùn)動(dòng)員準(zhǔn)備的時(shí)間分別是1s,2s,3s。系統(tǒng)等到他們都準(zhǔn)備好了,再發(fā)出起跑的信號(hào)。在這里CyclicBarrier 做法是在自己的構(gòu)造器中new了一個(gè)runnable,等待其他線程都執(zhí)行完,再執(zhí)行此runnable中的代碼。

我們?cè)倏纯碈ountDownLatch怎么實(shí)現(xiàn):

import java.util.concurrent.*;

public class RunTest {
 public static void main(String[] args) throws InterruptedException {
  ExecutorService pool = Executors.newCachedThreadPool();
  CountDownLatch countDownLatch = new CountDownLatch(3);
  int size = 3;

  for (int i = 0; i < size; i++) {
   int index = i;
   pool.submit(() -> {
    try {
     TimeUnit.SECONDS.sleep(index);
     countDownLatch.countDown();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    System.out.println("第" + index + "位運(yùn)動(dòng)員準(zhǔn)備好了");
   });
  }
  countDownLatch.await();
  System.out.println(size + "位運(yùn)動(dòng)員都準(zhǔn)備好了,可以起跑!");
 }
}

結(jié)果同上:

我們可以看到,countDownLatch是采取阻塞主線程的方法實(shí)現(xiàn)了線程的統(tǒng)一。他內(nèi)部有一個(gè)計(jì)數(shù)器,我們?cè)趫?zhí)行完一次線程任務(wù)的時(shí)候需要手動(dòng)的減一個(gè)數(shù),在主線程中使用 **countDownLatch.await()**監(jiān)控計(jì)數(shù)器的狀態(tài),知道計(jì)數(shù)器計(jì)到0為止,再執(zhí)行主線程的代碼。

在實(shí)際的開發(fā)中,我個(gè)人比較傾向于第二種方法,因?yàn)槭褂闷饋?lái)簡(jiǎn)單,完全滿足我的需求。

以上這篇基于CyclicBarrier和CountDownLatch的使用區(qū)別說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java異步編程之Callbacks與Futures模型詳解

    Java異步編程之Callbacks與Futures模型詳解

    這篇文章主要為大家詳細(xì)介紹了Java異步編程中Callbacks與Futures模型的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Java Listener監(jiān)聽(tīng)器使用規(guī)范詳細(xì)介紹

    Java Listener監(jiān)聽(tīng)器使用規(guī)范詳細(xì)介紹

    監(jiān)聽(tīng)器是一個(gè)專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽(tīng)和相應(yīng)處理的對(duì)象,當(dāng)被監(jiān)視的對(duì)象發(fā)生情況時(shí),立即采取相應(yīng)的行動(dòng)。監(jiān)聽(tīng)器其實(shí)就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序,這個(gè)程序?qū)iT用于監(jiān)聽(tīng)另一個(gè)java對(duì)象的方法調(diào)用或?qū)傩愿淖?/div> 2023-01-01
  • java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法

    java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法

    這篇文章主要為大家詳細(xì)介紹了java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java中實(shí)現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    Java中實(shí)現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    文章首先介紹了Java中進(jìn)行高清圖片壓縮的基本方法,包括使用Java標(biāo)準(zhǔn)庫(kù)ImageIO和第三方庫(kù)ApacheCommonsCompress,通過(guò)示例代碼展示了如何調(diào)整圖像質(zhì)量和使用第三方工具來(lái)壓縮圖片文件,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • SpringCloud鏈路追蹤組件Sleuth配置方法解析

    SpringCloud鏈路追蹤組件Sleuth配置方法解析

    這篇文章主要介紹了SpringCloud鏈路追蹤組件Sleuth配置方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java 在PDF中添加頁(yè)面跳轉(zhuǎn)按鈕功能(代碼演示)

    Java 在PDF中添加頁(yè)面跳轉(zhuǎn)按鈕功能(代碼演示)

    這篇文章主要介紹了Java 在PDF中添加頁(yè)面跳轉(zhuǎn)按鈕功能,本文給大家提供了多種功能的按鈕,需要的朋友可以參考下
    2019-11-11
  • 自己動(dòng)手編寫一個(gè)Mybatis插件之Mybatis脫敏插件

    自己動(dòng)手編寫一個(gè)Mybatis插件之Mybatis脫敏插件

    這篇文章主要介紹了自己動(dòng)手編寫一個(gè)Mybatis插件之Mybatis脫敏插件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 解決spring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問(wèn)題

    解決spring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問(wèn)題

    下面小編就為大家?guī)?lái)一篇解決spring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式

    SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式

    這篇文章主要介紹了SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • java如何導(dǎo)出insert語(yǔ)句并生成sql腳本

    java如何導(dǎo)出insert語(yǔ)句并生成sql腳本

    這篇文章主要介紹了java導(dǎo)出insert語(yǔ)句并生成sql腳本的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

临高县| 民勤县| 奈曼旗| 南召县| 武宣县| 日喀则市| 商南县| 定安县| 三穗县| 婺源县| 南川市| 临颍县| 宿州市| 孟村| 从江县| 济阳县| 晋中市| 武定县| 武夷山市| 会东县| 通城县| 林口县| 阿鲁科尔沁旗| 西和县| 岢岚县| 公安县| 河西区| 昭通市| 顺平县| 潼南县| 太康县| 秦皇岛市| 永川市| 南宫市| 高淳县| 岑溪市| 正阳县| 开江县| 景宁| 金山区| 方城县|