原創:轉載需注明原創地址 https://www.cnblogs.com/fanerwei222/p/11867895.html
Java線程--Phaser使用, 代碼里頭有詳細注釋:
package concurrent.phaser; import java.util.concurrent.Phaser; /** * 比賽階段器 */ public class GamePhaser extends Phaser { /** * 當一個階段的所有線程都到達時 , 執行該方法, 此時 phase自動加1 * @param phase * @param registeredParties * @return */ @Override protected boolean onAdvance(int phase, int registeredParties) { switch (phase) { case 0 : System.out.println("預賽完成"); return false; case 1: System.out.println("初賽完成"); return false; case 2: System.out.println("決賽完成"); return false; default: return true; } } }
package concurrent.phaser; import java.util.concurrent.Phaser; /** * 運動員類 */ public class Runner implements Runnable { private Phaser phaser; public Runner(Phaser phaser) { this.phaser = phaser; } @Override public void run() { /** * 參加預賽 */ System.out.println("選手-"+Thread.currentThread().getName()+":參加預賽"); /** * 預賽階段-----執行這個方法的話會等所有的選手都完成了之后再繼續下面的方法 */ phaser.arriveAndAwaitAdvance(); /** * 參加初賽 */ System.out.println("選手-"+Thread.currentThread().getName()+":參加初賽"); /** * 初賽階段-----執行這個方法的話會等所有的選手都完成了之后再繼續下面的方法 */ phaser.arriveAndAwaitAdvance(); /** * 參加決賽 */ System.out.println("選手-"+Thread.currentThread().getName()+":參加決賽"); /** * 決賽階段-----執行這個方法的話會等所有的選手都完成了之后再繼續下面的方法 */ phaser.arriveAndAwaitAdvance(); } }
package concurrent.phaser; /** * 比賽開始 */ public class RunnerGame { public static void main(String[] args) { int runnerNum = 4; GamePhaser gamePhaser = new GamePhaser(); /** * 注冊一次表示phaser維護的線程個數 */ gamePhaser.register(); for (int i = 0; i < runnerNum; i++ ) { /** * 注冊一次表示phaser維護的線程個數 */ gamePhaser.register(); new Thread(new Runner(gamePhaser)).start(); } /** * 后續階段主線程就不參加了 */ gamePhaser.arriveAndDeregister(); } }
打印如下:
選手-Thread-0:參加預賽 選手-Thread-1:參加預賽 選手-Thread-3:參加預賽 選手-Thread-2:參加預賽 預賽完成 選手-Thread-2:參加初賽 選手-Thread-0:參加初賽 選手-Thread-3:參加初賽 選手-Thread-1:參加初賽 初賽完成 選手-Thread-1:參加決賽 選手-Thread-2:參加決賽 選手-Thread-0:參加決賽 選手-Thread-3:參加決賽 決賽完成