Executor ExecutorService and Thread pools

ThreadPoolExecutor

Retrieving value from computation - Callable

submit vs execute exception handling differences

Fire and Forget - Runnable Tasks

Handle Rejected Execution

Use cases for different types of concurrency constructs

Wait for completion of all tasks in ExecutorService

Use cases for different types of ExecutorService

Scheduling tasks to run at a fixed time after a delay or repeatedly

Using Thread Pools