In this chapter, we will be looking at more patterns for staying away from explicit locking and state management. The theme is to let us focus on the business logic and the rest of the boilerplate of explicit thread creation and management handled by a framework.
This set of design patterns yields robust code as we reuse tried and tested, well-proven library code. We start with thread pooling as a major step toward focusing on our business logic as tasks. The pooling patterns give us a facility to run these tasks concurrently.
Firstly, we will cover the need for thread pools and the notion of a task. A task is a manifestation of the command design pattern, decoupling the task definition from its execution. We then look at ExecutorService, the pooling facility given by Java's threading library. Blocking queues are at the heart of this implementation. We will use the blocking queues to home grow our own pooling implementation.
Fork-Join is a major pooling implementation...