Wrap Up
While it's not possible to completely separate a spectator from a racer in a simulation that's running within a single virtual machine, by using the new java.util.concurrent package we can isolate the two in such a way that the behavior of one doesn't affect the behavior of the other, except where system resources are limitedand all without writing any threading utility classes of our own. In testing this sample application, increasing the number of Racers or Spectators had little effect on the overall execution time (until the system ran out of memory to handle more threads, of course).
The classes in java.util.concurrent are a very beneficial addition to the language, and while many multithreaded programming situations will still require some head-scratching, fewer should require custom classes.