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

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

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

2018.12.12更新

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

public static void main(String[] args) {
  ExecutorService pool = Executors.newCachedThreadPool();
  int size = 3;
  // 設置參數(shù)時,線程實際執(zhí)行數(shù)size+1,將main線程也加到等待隊列中
  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 + "位運動員準備好了");
     cyclicBarrier.await();
    } catch (Exception e) {
     e.printStackTrace();
    }
   });
  }
  try {
  //主線程也加入等待
   cyclicBarrier.await();
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.out.println(size + "位運動員都準備好了,可以起跑!");
 }

執(zhí)行結果:

以下是原內容:

我在使用并發(fā)線程柵欄的時候發(fā)現(xiàn)了兩種,分別是CyclicBarrier 和CountDownLatch。對于兩者的對比的文章有很多,這里不再贅述。我來說下我的使用過程。

**需求:**有三位運動員,他們一起參加萬米賽跑,但是他們準備的時間不同,要等他們都準備好了再開始一起跑。

使用CyclicBarrier 實現(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 + "位運動員都準備好了,可以起跑!");
   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 + "位運動員準備好了");
    try {
     cyclicBarrier.await();
    } catch (InterruptedException | BrokenBarrierException e) {
     e.printStackTrace();
    }
   });
  }
 }
}

結果:

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

我們再看看CountDownLatch怎么實現(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 + "位運動員準備好了");
   });
  }
  countDownLatch.await();
  System.out.println(size + "位運動員都準備好了,可以起跑!");
 }
}

結果同上:

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

在實際的開發(fā)中,我個人比較傾向于第二種方法,因為使用起來簡單,完全滿足我的需求。

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

相關文章

  • SpringBoot+aop實現(xiàn)主從數(shù)據(jù)庫的讀寫分離操作

    SpringBoot+aop實現(xiàn)主從數(shù)據(jù)庫的讀寫分離操作

    讀寫分離的作用是為了緩解寫庫,也就是主庫的壓力,但一定要基于數(shù)據(jù)一致性的原則,就是保證主從庫之間的數(shù)據(jù)一定要一致,這篇文章給大家介紹SpringBoot+aop實現(xiàn)主從數(shù)據(jù)庫的讀寫分離操作,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Spark?實現(xiàn)自定義加密的示例代碼

    Spark?實現(xiàn)自定義加密的示例代碼

    這篇文章主要介紹了Spark?實現(xiàn)自定義加密的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-07-07
  • Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉換方法

    Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉換方法

    這篇文章主要介紹了Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉換方法,涉及Java中toCharArray與valueOf方法的使用技巧,需要的朋友可以參考下
    2015-12-12
  • Java實現(xiàn)滑動驗證碼的示例代碼

    Java實現(xiàn)滑動驗證碼的示例代碼

    這篇文章主要為大家介紹了如何用Java語言實現(xiàn)滑動驗證碼的生成,項目采用了springboot,maven等技術,感興趣的小伙伴可以跟隨小編學習一下
    2022-02-02
  • springboot自定義攔截器簡單使用及舉例

    springboot自定義攔截器簡單使用及舉例

    Spring Boot攔截器是AOP的一種實現(xiàn),專門攔截對控制層的請求,主要應用于判斷用戶權限,攔截webSocket請求,下面這篇文章主要給大家介紹了關于springboot自定義攔截器簡單使用及舉例的相關資料,需要的朋友可以參考下
    2023-01-01
  • Java幾種分布式全局唯一ID生成方案

    Java幾種分布式全局唯一ID生成方案

    本文主要介紹了聊聊幾種分布式全局唯一ID生成方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • elasticsearch索引index數(shù)據(jù)功能源碼示例

    elasticsearch索引index數(shù)據(jù)功能源碼示例

    這篇文章主要為大家介紹了elasticsearch索引index功能源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Java中replace與replaceAll的區(qū)別與測試

    Java中replace與replaceAll的區(qū)別與測試

    replace和replaceAll是JAVA中常用的替換字符的方法,下面這篇文章主要給大家介紹了關于Java中replace與replaceAll的區(qū)別與測試,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • SpringBoot實現(xiàn)在一個模塊中引入另一個模塊

    SpringBoot實現(xiàn)在一個模塊中引入另一個模塊

    這篇文章主要介紹了SpringBoot實現(xiàn)在一個模塊中引入另一個模塊的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • idea添加數(shù)據(jù)庫圖文教程

    idea添加數(shù)據(jù)庫圖文教程

    這篇文章主要介紹了idea添加數(shù)據(jù)庫圖文教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論