package exercises.ex_y; import exercises.Utils; import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicInteger; public class Runner implements Runnable { private static AtomicInteger nextId = new AtomicInteger(0); private final int id; private final int maxStep; private final Phaser phaser; public Runner(int maxStep, Phaser phaser) { id = nextId.getAndIncrement(); this.maxStep = maxStep; this.phaser = phaser; phaser.register(); } @Override public void run() { System.out.println(this + " is on the starting line"); phaser.arriveAndAwaitAdvance(); while (phaser.getPhase() <= this.maxStep) { System.out.println(this + " started stage " + phaser.getPhase()); try { Utils.randomSleep(1000, 5000); } catch (InterruptedException e) { break; } System.out.println(this + " finished stage " + phaser.getPhase()); phaser.arriveAndAwaitAdvance(); } phaser.arriveAndDeregister(); } @Override public String toString() { return "Runner " + id; } }