亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

如何在Java中利用CyclicBarrier實現并發編程

發布時間:2020-11-26 17:36:22 來源:億速云 閱讀:161 作者:Leah 欄目:編程語言

如何在Java中利用CyclicBarrier實現并發編程?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

  使用JAVA編寫并發程序的時候,我們需要仔細去思考一下并發流程的控制,如何讓各個線程之間協作完成某項工作。有時候,我們啟動N個線程去做一件事情,只有當這N個線程都達到某一個臨界點的時候,我們才能繼續下面的工作,就是說如果這N個線程中的某一個線程先到達預先定義好的臨界點,它必須等待其他N-1線程也到達這個臨界點,接下來的工作才能繼續,只要這N個線程中有1個線程沒有到達所謂的臨界點,其他線程就算搶先到達了臨界點,也只能等待,只有所有這N個線程都到達臨界點后,接下來的事情才能繼續。

一、場景描述

有四個游戲玩家玩游戲,游戲有三個關卡,每個關卡必須要所有玩家都到達后才能允許通過。其實這個場景里的玩家中如果有玩家A先到了關卡1,他必須等到其他所有玩家都到達關卡1時才能通過,也就是說線程之間需要相互等待。這和CountDownLatch的應用場景有區別,CountDownLatch里的線程是到了運行的目標后繼續干自己的其他事情,而這里的線程需要等待其他線程后才能繼續完成下面的工作。

二、CyclicBarrier介紹

CyclicBarrier 的字面意思是可循環使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續干活。CyclicBarrier默認的構造方法是CyclicBarrier(int parties),其參數表示屏障攔截的線程數量,每個線程調用await方法告訴CyclicBarrier我已經到達了屏障,然后當前線程被阻塞。

CyclicBarrier類有兩個常用的構造方法:

1. CyclicBarrier(int parties)

這里的parties也是一個計數器,例如,初始化時parties里的計數是3,于是擁有該CyclicBarrier對象的線程當parties的計數為3時就喚醒,注:這里parties里的計數在運行時當調用CyclicBarrier:await()時,計數就加1,一直加到初始的值

2. CyclicBarrier(int parties, Runnable barrierAction)

這里的parties與上一個構造方法的解釋是一樣的,這里需要解釋的是第二個入參(Runnable barrierAction),這個參數是一個實現Runnable接口的類的對象,也就是說當parties加到初始值時就出發barrierAction的內容。

代碼示例

package com.itmyhome;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;


/**
 * 玩家類
 * @author itmyhome
 *
 */
class Player implements Runnable {
  private CyclicBarrier cyclicBarrier;
  private int id;

  public Player(int id, CyclicBarrier cyclicBarrier) {
    this.cyclicBarrier = cyclicBarrier;
    this.id = id;
  }

  @Override
  public void run() {
    try {
      System.out.println("玩家" + id + "正在玩第一關...");
      cyclicBarrier.await();
      System.out.println("玩家" + id + "進入第二關...");
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (BrokenBarrierException e) {
      e.printStackTrace();
    }
  }
}


public class CyclicBarrierTest {
  public static void main(String[] args) {
    // CyclicBarrier cyclicBarrier = new CyclicBarrier(4);
    CyclicBarrier cyclicBarrier = new CyclicBarrier(4,
        new Runnable() {
          @Override
          public void run() {
            System.out.println("所有玩家進入第二關!");
          }
        });

    for (int i = 0; i < 4; i++) {
      new Thread(new Player(i, cyclicBarrier)).start();
    }
  }
}

輸出結果:

玩家0正在玩第一關...
玩家3正在玩第一關...
玩家2正在玩第一關...
玩家1正在玩第一關...
所有玩家進入第二關!
玩家3進入第二關...
玩家1進入第二關...
玩家2進入第二關...
玩家0進入第二關...

CyclicBarrier和CountDownLatch的區別

  • CountDownLatch: 一個線程(或者多個), 等待另外N個線程完成某個事情之后才能執行。

  • CyclicBarrier: N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待。

  • CountDownLatch的計數器只能使用一次。而CyclicBarrier的計數器可以使用reset() 方法重置。所以CyclicBarrier能處理更為復雜的業務場景,比如如果計算發生錯誤,可以重置計數器,并讓線程們重新執行一次。

  • CountDownLatch:減計數方式,CyclicBarrier:加計數方式

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

向AI問一下細節

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

AI

启东市| 禹州市| 安远县| 合水县| 缙云县| 河池市| 六安市| 东乌珠穆沁旗| 霍城县| 炉霍县| 黄浦区| 通州区| 常熟市| 嵩明县| 灌南县| 宿松县| 阿克| 富裕县| 肥城市| 斗六市| 睢宁县| 东乡县| 元江| 霍林郭勒市| 内丘县| 舟山市| 天祝| 尼木县| 兰溪市| 临夏县| 阳山县| 雷山县| 祥云县| 琼中| 东方市| 双柏县| 上虞市| 斗六市| 宁都县| 易门县| 邵东县|