- A Somewhat Complex Example
- Starting and Stopping
- Spectators
- Timing, Scoring, and Spectating
- Startup and Shutdown
- Wrap Up
Starting and Stopping
To start the race, and ultimately to stop it, we'll use a java.util.concurrent class called CountDownLatch, which allows you to queue up a number of threads and start them all at once. You create a CountDownLatch with an integer count and decrement it by calling countDown(). A thread that calls await() on a CountDownLatch will sleep until the count gets to zero, and then continue on its merry way.
Our example includes two CountDownLatch instances: a greenFlag that starts the race and a checkeredFlag that each Racer decrements when it crosses the finish line for the final time. Here's how we handle that setup in the run() method for the Racer class:
public void run() { SectorTime sectorTime = null; int currLap = 0; try { getGreenFlag().await(); System.out.println("Racer " + getName() + " starting!"); while(!getEvent().getStatus().isRaceCompleted()) { ++currLap; for(int sector = 0; sector < getEvent().getStatus().NUM_SECTORS; ++sector) { Thread.sleep((long)(100+ (Math.random() * 50))); sectorTime = new SectorTime(this, currLap, sector); getEvent().getStatus().addTimeToSectorQueue(sector, sectorTime); } } getCheckeredFlag().countDown(); } catch(Exception e){} }
This method waits for the green flag to be dropped; then it starts posting times, sleeping some amount of time between sectors to simulate the time spent driving from sector to sector. When the race has been completed by the leader, the loop ends, and the checkered flag count is decremented. Assuming that you created the green flag with a count of 1, starting all the Racers at once is this easy:
getGreenFlag().countDown();