中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行并發工具類CountDownLatch與CyclicBarrier分析

發布時間:2021-12-29 14:52:26 來源:億速云 閱讀:269 作者:柒染 欄目:大數據

如何進行并發工具類CountDownLatch與CyclicBarrier分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

CountDownLatch

基本的流程是一個線程等待其他的線程完成工作以后再執行,加強版join

類的主要方法,await用來等待,countDown(在線程里面)用來減一。

      由初始化線程決定是否放行。

我們來用代碼演示下CountDownLatch的基本使用:

public class UserCountDownLatch {  static CountDownLatch latch = new CountDownLatch(6);  //初始化線程  private static class InitThread implements Runnable{    @Override    public void run() {      System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work ...");      latch.countDown();//初始化線程完成工作了。扣一次    }  }  public static void main(String[] args) throws InterruptedException {    //單獨的初始化線程,初始化分為2步,需扣減兩次    new Thread(new Runnable() {      @Override      public void run() {        try {          Thread.sleep(1000);          System.out.println("Thread_"+Thread.currentThread().getId()              +" ready init work step lst.....");          latch.countDown();//每完成一步工作,就扣減一次          System.out.println("begin step 2nd......");          Thread.sleep(1000);          System.out.println("Thread_"+Thread.currentThread().getId()              +" ready init work step 2nd.....");          latch.countDown();//每完成一步工作,就扣減一次        } catch (InterruptedException e) {          // TODO Auto-generated catch block          e.printStackTrace();        }
     }    }).start();    for(int i=0;i<=3;i++){      Thread thread = new Thread(new InitThread());      thread.start();    }    latch.await();    System.out.println("Main do ites work ....");  }}

 結果:

Thread_14 ready init work ...Thread_12 ready init work ...Thread_11 ready init work ...Thread_13 ready init work ...Thread_10 ready init work step lst.....begin step 2nd......Thread_10 ready init work step 2nd.....Main do ites work ....

小結:就必須等到countDown減完才開始執行main方法后面的程序。

CyclicBarrier

讓一組線程達到某個屏障,被阻塞,一直到組內最后一個線程達到屏障時,屏障開放,所有被阻塞的線程會繼續運行。

      由工作線程決定是否運行。

我們來用代碼演示下CyclicBarrier的基本使用:

public class UseCyclicBarrier {  private static CyclicBarrier barrier =       new CyclicBarrier(5,new CollectThread());//屏障開放后,CollectThread()就會執行.    private static ConcurrentHashMap<String, Long> resultMap =       new ConcurrentHashMap<String, Long>();//存放子線程工作結果的容器    public static void main(String[] args){    for(int i=0;i<=4;i++){      Thread thread = new Thread(new SubThread());      thread.start();    }  }  //負責屏障開放以后的工作  private static class CollectThread implements Runnable{    @Override    public void run() {      StringBuilder result = new StringBuilder();      for(Map.Entry<String, Long> workResult:resultMap.entrySet()){        result.append("["+workResult.getValue()+"]");      }            System.out.println("the result = "+result);      System.out.println("do other business......");    }    }  //工作線程  private static class SubThread implements Runnable{    @Override    public void run() {      long id = Thread.currentThread().getId();      resultMap.put(Thread.currentThread().getId()+"", id);      Random r = new Random();//隨機決定工作線程的是否睡眠      try{        if(r.nextBoolean()){            Thread.sleep(2000+id);            System.out.println("Thread_"+id+".....do its business ");          }          System.out.println(id+".....is await");          barrier.await();//          Thread.sleep(1000+id);          System.out.println("Thread_"+id+".....do its business ");        }catch(Exception e){          e.printStackTrace();        }      }    }  }

小結:在初始化的時候,開放屏障后,可以使用指定執行的線程。

CyclicBarrier(int parties,RunnablebarrierAction)

不同在于動作的實施者是不同的,CountDownLatch 的下一步動作實施者是main函數,而CyclicBarrier下一步的動作實施者可以為其他線程。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孟津县| 翁牛特旗| 高邮市| 北流市| 伊川县| 苏尼特左旗| 鹿泉市| 云南省| 宜昌市| 威宁| 桂阳县| 乐清市| 离岛区| 东山县| 车险| 长汀县| 昂仁县| 祁连县| 樟树市| 靖西县| 堆龙德庆县| 家居| 长春市| 平原县| 铜梁县| 营山县| 安宁市| 武鸣县| 宝丰县| 沙洋县| 金华市| 喀喇| 遵义县| 会同县| 虹口区| 尚义县| 聂拉木县| 永兴县| 即墨市| 陇川县| 北票市|