Java CyclicBarrier 淺談

來源:互聯網
上載者:User

標籤:imp   .sh   java   span   複雜   rgs   構造   class   拋出異常   

CyclicBarrier 意思是柵欄, 可以讓多組線程到達某個點後開始等待, 等指定的線程數量都到達後再恢複線程, 這個CyclicBarrier是可以迴圈使用的. 又稱為迴圈柵欄.

栗子:

public class BarrierDemo {    public static void main(String[] args) {        ExecutorService service = Executors.newFixedThreadPool(5);        final CyclicBarrier barrier = new CyclicBarrier(5);        for (int i = 0; i < 5; i++) {            service.execute(new Player("玩家" + i, barrier));        }        service.shutdown();    }}public class Player implements Runnable {    private final String name;    private final CyclicBarrier barrier;    public Player(String name, CyclicBarrier barrier) {        this.name = name;        this.barrier = barrier;    }    public void run() {        try {            TimeUnit.SECONDS.sleep(1 + (new Random().nextInt(3)));            System.out.println(name + "已準備,等待其他玩家準備...");            barrier.await();            TimeUnit.SECONDS.sleep(1 + (new Random().nextInt(3)));            System.out.println(name + "已加入遊戲");        } catch (InterruptedException e) {            System.out.println(name + "離開遊戲");        } catch (BrokenBarrierException e) {            System.out.println(name + "離開遊戲");        }    }}

CyclicBarrier 有兩個建構函式:

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

參數parties指定線程數量,當指定的線程值都到達柵欄點時,柵欄開啟,線程恢複。需要注意的是,當指定的線程數量大於啟動的線程數量,比如修改上例中的代碼,只啟動9個線程,那麼所有的線程將一直處於等待狀態。第二種情況是指定的線程數量小於啟動的線程,上例代碼,啟動11個線程,那麼當第十個線程到達柵欄點時,那麼這十個線程就會恢複繼續執行,而第十一個線程將一直處於阻塞狀態。

CyclicBarrier還提供一個更進階的建構函式CyclicBarrier(int parties, Runnable barrierAction),用於線上程到達屏障時,優先執行barrierAction,方便處理更複雜的業務情境。

CyclicBarrier的方法:

1. await() 使用該方法可以使得當前線程在柵欄點處進行阻塞, 等待所有線程.

2. await(long timeout, TimeUnit unit) 增加timeout參數, 等待逾時後會拋出異常.

3. getNumberWaiting() 返回當前在柵欄處等待的參與者數目。此方法主要用於調試和斷言。

4. getParties() 該方法可以獲得建構函式中指定的需要在柵欄點阻塞的線程數量

 

Java CyclicBarrier 淺談

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.