<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      CyclicBarrier使用詳解

      1. CyclicBarrier 是什么?

      從字面上的意思可以知道,這個類的中文意思是“循環柵欄”。大概的意思就是一個可循環利用的屏障。

      它的作用就是會讓所有線程都等待完成后才會繼續下一步行動。

      舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規定必須等到所有人到齊之后才會讓我們進去。這里的朋友們就是各個線程,餐廳就是 CyclicBarrier。

      2. 怎么使用 CyclicBarrier

      2.1 構造方法

      public CyclicBarrier(int parties)
      public CyclicBarrier(int parties, Runnable barrierAction)

      解析:

      • parties 是參與線程的個數
      • 第二個構造方法有一個 Runnable 參數,這個參數的意思是最后一個到達線程要做的任務

      2.2 重要方法

      public int await() throws InterruptedException, BrokenBarrierException
      public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException

      解析:

      • 線程調用 await() 表示自己已經到達柵欄
      • BrokenBarrierException 表示柵欄已經被破壞,破壞的原因可能是其中一個線程 await() 時被中斷或者超時

      2.3 基本使用

      2.3.1 需求

      一個線程組的線程需要等待所有線程完成任務后再繼續執行下一次任務

      2.3.2 代碼實現

      public class CyclicBarrierDemo {
      
          static class TaskThread extends Thread {
              
              CyclicBarrier barrier;
              
              public TaskThread(CyclicBarrier barrier) {
                  this.barrier = barrier;
              }
              
              @Override
              public void run() {
                  try {
                      Thread.sleep(1000);
                      System.out.println(getName() + " 到達柵欄 A");
                      barrier.await();
                      System.out.println(getName() + " 沖破柵欄 A");
                      
                      Thread.sleep(2000);
                      System.out.println(getName() + " 到達柵欄 B");
                      barrier.await();
                      System.out.println(getName() + " 沖破柵欄 B");
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }
          
          public static void main(String[] args) {
              int threadNum = 5;
              CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
                  
                  @Override
                  public void run() {
                      System.out.println(Thread.currentThread().getName() + " 完成最后任務");
                  }
              });
              
              for(int i = 0; i < threadNum; i++) {
                  new TaskThread(barrier).start();
              }
          }
          
      }
      打印結果:
      
      Thread-1 到達柵欄 A
      Thread-3 到達柵欄 A
      Thread-0 到達柵欄 A
      Thread-4 到達柵欄 A
      Thread-2 到達柵欄 A
      Thread-2 完成最后任務
      Thread-2 沖破柵欄 A
      Thread-1 沖破柵欄 A
      Thread-3 沖破柵欄 A
      Thread-4 沖破柵欄 A
      Thread-0 沖破柵欄 A
      Thread-4 到達柵欄 B
      Thread-0 到達柵欄 B
      Thread-3 到達柵欄 B
      Thread-2 到達柵欄 B
      Thread-1 到達柵欄 B
      Thread-1 完成最后任務
      Thread-1 沖破柵欄 B
      Thread-0 沖破柵欄 B
      Thread-4 沖破柵欄 B
      Thread-2 沖破柵欄 B
      Thread-3 沖破柵欄 B

      從打印結果可以看出,所有線程會等待全部線程到達柵欄之后才會繼續執行,并且最后到達的線程會完成 Runnable 的任務。

      3. CyclicBarrier 使用場景

      可以用于多線程計算數據,最后合并計算結果的場景。

      4. CyclicBarrier 與 CountDownLatch 區別

      • CountDownLatch 是一次性的,CyclicBarrier 是可循環利用的
      • CountDownLatch 參與的線程的職責是不一樣的,有的在倒計時,有的在等待倒計時結束。CyclicBarrier 參與的線程職責是一樣的。

       

      posted @ 2022-09-22 15:30  Hexrui  閱讀(54)  評論(0)    收藏  舉報
      返回頂部
      主站蜘蛛池模板: 少妇激情一区二区三区视频小说| 黑人巨茎大战欧美白妇| 中文字幕人妻无码一区二区三区 | 成A人片亚洲日本久久| av色蜜桃一区二区三区| 91九色国产成人久久精品| 四虎库影成人在线播放| 久久综合伊人77777| 久久精品一区二区三区中文字幕| 久草热在线视频免费播放| 国产成人啪精品午夜网站| 在线精品国产中文字幕| 九九久久人妻一区精品色| 精品一区二区不卡免费| 成人年无码av片在线观看| 国产精品国产三级国快看| AV无码免费不卡在线观看| 国产日韩一区二区在线| 云龙县| 亚洲五月丁香综合视频| 日本三级香港三级人妇99| 国产欧美亚洲精品第一页在线| 久久精品99国产国产精| 噜噜综合亚洲av中文无码| 在线观看中文字幕国产码| 欧美 喷水 xxxx| 国产视频一区二区三区麻豆| 无遮挡粉嫩小泬久久久久久久| 成人午夜无人区一区二区| 少妇人妻偷人偷人精品| 国模肉肉视频一区二区三区| 国产系列丝袜熟女精品视频 | 亚洲av区一区二区三区| 国产精品免费看久久久| 午夜天堂一区人妻| 亚洲av专区一区| 久久99国产精一区二区三区!| 定兴县| 亚洲国产欧美在线人成| 伊人久久大香线蕉网av| 成人av天堂网在线观看|