I have always read that creating threads is expensive.
I also know that you cannot rerun a thread.
I see in the doc of Executors class:
A thread pool creates its own threads and supplies its own clever little Runnables for those threads. Those Runnables never end but synchronize on a queue (they wait()) until a Callable is present in that queue; they are notified when that happens and their Runnable runs the Callable from the queue and the entire scenario repeats itself again.