Executors class has factory methods that act on a pool of threads, rather than on a single thread. A thread pool is a group of pre-instantiated reusable threads that are available to perform a set of arbitrary tasks. The following table describes methods for creating pools :
|Method Name||Return Type||Description|
|newSingleThreadExecutor()||ExecutorService||Creates a single-threaded executor that uses a single worker thread operating off an unbounded queue. Results are processed sequentially in the order in which they are submitted.|
|Creates a single-threaded executor that can schedule commands to run after a given delay or to execute periodically|
|newCachedThreadPool()||ExecutorService||Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available|
|newFixedThreadPool(int nThreads)||ExecutorService||Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue|
|Creates a thread pool that can schedule commands to run after a given delay or to execute periodically|
There are also overloaded versions of each of the methods in above table that create threads using a ThreadFactory input parameter.
The difference between a single-thread and a pooled-thread executor is what happens when a task is already running. While a single-thread executor will wait for an available thread to become available before running the next task, a pooled-thread executor can execute the next task concurrently. If the pool runs out of available threads, the task will be queued by the thread executor and wait to be completed.