OnJava8-Examples/lowlevel/HorseRace.java

133 lines
3.8 KiB
Java
Raw Normal View History

2016-12-07 10:34:41 -08:00
// lowlevel/HorseRace.java
2016-12-30 17:23:13 -08:00
// (c)2017 MindView LLC: see Copyright.txt
2015-11-15 15:51:35 -08:00
// We make no guarantees that this code is fit for any purpose.
2016-09-23 13:23:35 -06:00
// Visit http://OnJava8.com for more book information.
2016-01-25 18:05:55 -08:00
// Using CyclicBarriers
2015-06-15 17:47:35 -07:00
import java.util.concurrent.*;
import java.util.*;
2016-12-21 11:06:49 -08:00
import onjava.Nap;
2015-06-15 17:47:35 -07:00
class Horse implements Runnable {
private static int counter = 0;
private final int id = counter++;
private int strides = 0;
2016-01-25 18:05:55 -08:00
private static SplittableRandom rand = new SplittableRandom(47);
2015-06-15 17:47:35 -07:00
private static CyclicBarrier barrier;
public Horse(CyclicBarrier b) { barrier = b; }
public synchronized int getStrides() { return strides; }
@Override
public void run() {
try {
while(!Thread.interrupted()) {
synchronized(this) {
2016-01-25 18:05:55 -08:00
strides += rand.nextInt(3); // Yeilds 0, 1 or 2
2015-06-15 17:47:35 -07:00
}
barrier.await();
}
} catch(InterruptedException e) {
// A legitimate way to exit
} catch(BrokenBarrierException e) {
// This one we want to know about
throw new RuntimeException(e);
}
}
@Override
public String toString() { return "Horse " + id + " "; }
public String tracks() {
StringBuilder s = new StringBuilder();
for(int i = 0; i < getStrides(); i++)
s.append("*");
s.append(id);
return s.toString();
}
}
public class HorseRace {
static final int FINISH_LINE = 60;
2015-06-15 17:47:35 -07:00
private List<Horse> horses = new ArrayList<>();
private ExecutorService exec =
Executors.newCachedThreadPool();
private CyclicBarrier barrier;
public HorseRace(int nHorses, final int pause) {
barrier = new CyclicBarrier(nHorses, () -> {
StringBuilder s = new StringBuilder();
for(int i = 0; i < FINISH_LINE; i++)
s.append("="); // The fence on the racetrack
2015-11-03 12:00:44 -08:00
System.out.println(s);
2015-06-15 17:47:35 -07:00
for(Horse horse : horses)
2015-11-03 12:00:44 -08:00
System.out.println(horse.tracks());
2015-06-15 17:47:35 -07:00
for(Horse horse : horses)
if(horse.getStrides() >= FINISH_LINE) {
2015-11-03 12:00:44 -08:00
System.out.println(horse + "won!");
2015-06-15 17:47:35 -07:00
exec.shutdownNow();
return;
}
2016-12-21 11:06:49 -08:00
new Nap(pause);
2015-06-15 17:47:35 -07:00
});
for(int i = 0; i < nHorses; i++) {
Horse horse = new Horse(barrier);
horses.add(horse);
exec.execute(horse);
}
}
public static void main(String[] args) {
int nHorses = 7;
int pause = 200;
if(args.length > 0) { // Optional argument
int n = new Integer(args[0]);
nHorses = n > 0 ? n : nHorses;
}
if(args.length > 1) { // Optional argument
int p = new Integer(args[1]);
pause = p > -1 ? p : pause;
}
new HorseRace(nHorses, pause);
}
2015-09-07 11:44:36 -06:00
}
2016-07-20 06:32:39 -06:00
/* Output: (First and Last 18 Lines)
2015-06-15 17:47:35 -07:00
===========================================================
=
2016-07-22 14:45:35 -06:00
0
2015-06-15 17:47:35 -07:00
**1
2016-07-22 14:45:35 -06:00
2
*3
2015-06-15 17:47:35 -07:00
**4
2016-07-27 11:12:11 -06:00
*5
**6
2015-06-15 17:47:35 -07:00
===========================================================
=
2016-07-22 14:45:35 -06:00
**0
2016-07-27 11:12:11 -06:00
***1
*2
*3
****4
**5
2016-07-27 11:12:11 -06:00
****6
2015-06-15 17:47:35 -07:00
===========================================================
=
2016-07-22 14:45:35 -06:00
**0
...________...________...________...________...
**********************************************6
2015-06-15 17:47:35 -07:00
===========================================================
=
**************************************************0
*************************************************1
*********************************************2
2015-06-15 17:47:35 -07:00
***********************************************************
3
*****************************************************4
*****************************************************5
***********************************************6
2015-06-15 17:47:35 -07:00
===========================================================
=
****************************************************0
*************************************************1
***********************************************2
2015-06-15 17:47:35 -07:00
***********************************************************
*3
*******************************************************4
*******************************************************5
***********************************************6
2015-06-15 17:47:35 -07:00
Horse 3 won!
2015-09-07 11:44:36 -06:00
*/