How newCachedThreadPool reuses threads?

executorservice, java, multithreading

Solution

An Runnable can call another Runnable.

Each thread runs only one main Runnable, but that Runnable takes Runnables from a shared BlockingQueue and calls these until it is shutdown.

Simplified it does.

final BlockingQueue<Runnable> queue = ...

Runnable runs = new Runnable() { public void run() {
    while(running)
        queue.take().run();
}};

You can read the code to see how it really does it.

Problem

The javadoc says that the service returned by `Executors.newCachedThreadPool` reuses threads. How is this possible? A thread can only be started once by calling `start`. So how do they implement it? Threads of this service are running in an infinite loop and their `Runnable`-s are replaced on demand?

Original source