added ex Y
This commit is contained in:
		
							
								
								
									
										21
									
								
								src/exercises/ex_y/RaceTester.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/exercises/ex_y/RaceTester.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| package exercises.ex_y; | ||||
|  | ||||
| import java.util.concurrent.Phaser; | ||||
|  | ||||
| public class RaceTester { | ||||
|     public static final int NUM_RUNNERS = 10; | ||||
|     public static final int NUM_STAGES = 5; | ||||
|  | ||||
|     public static void main(String[] args) throws InterruptedException { | ||||
|         Phaser phaser = new Phaser(); | ||||
|         phaser.register(); | ||||
|         for (int i = 0; i < NUM_RUNNERS; i++) { | ||||
|             new Thread(new Runner(NUM_STAGES, phaser)).start(); | ||||
|         } | ||||
|         for (int i = 0; i <= NUM_STAGES; i++) { | ||||
|             phaser.arriveAndAwaitAdvance(); | ||||
|         } | ||||
|         System.out.println("Finished race"); | ||||
|         phaser.arriveAndDeregister(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								src/exercises/ex_y/Runner.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/exercises/ex_y/Runner.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										1
									
								
								src/exercises/ex_y/answers.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/exercises/ex_y/answers.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| We should use a Phaser as it allows for threads to wait on each other before moving to the next step | ||||
		Reference in New Issue
	
	Block a user