java.util.concurrent CyclicBarrier類
阿新 • • 發佈:2017-11-02
實現 .cn tint style pub interrupt com err rup
CyclicBarrier類:
原文:一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待線程後可以重用,所以稱它為循環的 barrier。CyclicBarrier支持一個可選的 Runnable 命令,在一組線程中的最後一個線程到達之後(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作 很有用。
說人話:它可以讓多個線程阻塞,調用CyclicBarrier的await()方法讓線程一直在等待,直到所有線程都到達屏障後再喚醒。
CyclicBarrier提供2個構造方法:
CyclicBarrier(int parties)
CyclicBarrier(int parties, Runnable barrierAction)
下面的例子使用第二個構造方法,模擬10個狙擊手分別就位,如果10個狙擊手都已經就位完畢,則報告給指揮官,指揮官下達命令後才能進行射擊。
public class Demo { public static void main(String[] args) { //定義10個狙擊手 int threadNum = 10;//實例化一個CyclicBarrier(循環屏障) CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, new Runnable(){ @Override public void run(){ System.out.println("負責人:報告指揮官,所有狙擊手已就位完畢。"); System.out.println("指揮官:行動!"); } });//模擬加入10個線程 for(int i=1; i<=threadNum; i++){ new Thread(new Sniper(cyclicBarrier, "狙擊手" + i + "號")).start(); } } }
定義一個狙擊手的類,並實現Runnable接口。
public class Sniper implements Runnable { private CyclicBarrier cyclicBarrier; private String name; public Sniper(CyclicBarrier cyclicBarrier, String name){ this.cyclicBarrier = cyclicBarrier; this.name = name; } @Override public void run() { try { //隨機0-10秒模擬狙擊手就位需要的時間 Random ran = new Random(); int millisecond = (ran.nextInt(10) + 1); int second = millisecond * 1000; Thread.sleep(second); //準備好之後,報告已就位 System.out.println( name + ":已就位,用時" + millisecond + "秒。"); //調用cyclicBarrier.await()方法進行等待 cyclicBarrier.await(); //狙擊手打擊目標 System.out.println( name + ":報告," + (millisecond % 2 == 1 ? "已擊斃敵人。" : "未命中。")); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }
效果如下:
java.util.concurrent CyclicBarrier類