From CJP 5.5, FutureTask:
FutureTask is used by the Executor framework to represent asynchronous
tasks, and can also be used to represent any potentially lengthy
computation that can be started before the results are needed. Preloader
in Listing 5.12 uses FutureTask to perform an expensive computation
whose results are needed later; by starting the computation early, you
reduce the time you would have to wait later when you actually need the
results.
* From CJP 5.5 
 * TestHarness in Listing 5.11 illustrates two common uses for
 * latches. TestHarness creates a number of threads that run a given
task
 * concurrently. It uses two latches, a "starting gate" and an "ending
gate".
 * The starting gate is initialized with a count of one; the ending gate
is
 * initialized with a count equal to the number of worker threads. The
first
 * thing each worker thread does is wait on the starting gate; this
ensures that
 * none of them starts working until they all are ready to start. The
last thing
 * each does is count down on the ending gate; this allows the master
thread to
 * wait efficiently until the last of the worker threads has finished,
so it can
 * calculate the elapsed time.
PreLoader need it