Prior to java 1.5 version, Thread/Runnable was designed for two separate services
- Unit of work
- Execution of that unit of work
ExecutorService decouples those two services by designating Runnable/Callable as unit of work and Executor as a mechanism to execute ( with lifecycling) the unit of work