Java之CyclicBarrier使用
阿新 • • 發佈:2017-12-06
main href data 第一個 -o 重用 color oid 導致
http://blog.csdn.net/shihuacai/article/details/8856407
1、類說明:
一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待線程後可以重用,所以稱它為循環 的 barrier。
2、使用場景:需要所有的子任務都完成時,才執行主任務,這個時候就可以選擇使用CyclicBarrier。
3、常用方法:await
public int await() throws InterruptedException, BrokenBarrierException
- 在所有參與者都已經在此 barrier 上調用 await方法之前,將一直等待。如果當前線程不是將到達的最後一個線程,出於調度目的,將禁用它,且在發生以下情況之一前,該線程將一直處於休眠狀態:
- 最後一個線程到達;或者
- 其他某個線程中斷當前線程;或者
- 其他某個線程中斷另一個等待線程;或者
- 其他某個線程在等待 barrier 時超時;或者
- 其他某個線程在此 barrier 上調用
reset()
。
如果當前線程:
- 在進入此方法時已經設置了該線程的中斷狀態;或者
- 在等待時被中斷
則拋出
InterruptedException
,並且清除當前線程的已中斷狀態。如果在線程處於等待狀態時 barrier 被reset()
BrokenBarrierException
異常。如果任何線程在等待時被 中斷,則其他所有等待線程都將拋出
BrokenBarrierException
異常,並將 barrier 置於損壞狀態。如果當前線程是最後一個將要到達的線程,並且構造方法中提供了一個非空的屏障操作,則在允許其他線程繼續運行之前,當前線程將運行該操作。如果在執行屏障操作過程中發生異常,則該異常將傳播到當前線程中,並將 barrier 置於損壞狀態。
- 返回:
- 到達的當前線程的索引,其中,索引
getParties()
- 1 - 拋出:
InterruptedException
- 如果當前線程在等待時被中斷BrokenBarrierException
- 如果另一個 線程在當前線程等待時被中斷或超時,或者重置了 barrier,或者在調用await
時 barrier 被損壞,抑或由於異常而導致屏障操作(如果存在)失敗。
賽跑時,等待所有人都準備好時,才起跑:
[java] view plain copy- public class CyclicBarrierTest {
- public static void main(String[] args) throws IOException, InterruptedException {
- //如果將參數改為4,但是下面只加入了3個選手,這永遠等待下去
- //Waits until all parties have invoked await on this barrier.
- CyclicBarrier barrier = new CyclicBarrier(3);
- ExecutorService executor = Executors.newFixedThreadPool(3);
- executor.submit(new Thread(new Runner(barrier, "1號選手")));
- executor.submit(new Thread(new Runner(barrier, "2號選手")));
- executor.submit(new Thread(new Runner(barrier, "3號選手")));
- executor.shutdown();
- }
- }
- class Runner implements Runnable {
- // 一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)
- private CyclicBarrier barrier;
- private String name;
- public Runner(CyclicBarrier barrier, String name) {
- super();
- this.barrier = barrier;
- this.name = name;
- }
- @Override
- public void run() {
- try {
- Thread.sleep(1000 * (new Random()).nextInt(8));
- System.out.println(name + " 準備好了...");
- // barrier的await方法,在所有參與者都已經在此 barrier 上調用 await 方法之前,將一直等待。
- barrier.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (BrokenBarrierException e) {
- e.printStackTrace();
- }
- System.out.println(name + " 起跑!");
- }
- }
輸出結果:
3號選手 準備好了... 2號選手 準備好了... 1號選手 準備好了... 1號選手 起跑! 2號選手 起跑! 3號選手 起跑!
轉載地址:http://www.itzhai.com/the-introduction-and-use-of-cyclicbarrier.html
Java之CyclicBarrier使用