A service that decouples the production of new asynchronous tasks from the consumption of the results of completed tasks. Producers
submit
tasks for execution. Consumers
take
completed tasks and process their results in the order they complete. A
CompletionService
can for example be used to manage asynchronous I/O, in which tasks that perform reads are submitted in one part of a program or system, and then acted upon in a different part of the program when the reads complete, possibly in a different order than they were requested.
Typically, a CompletionService
relies on a separate Executor
to actually execute the tasks, in which case the CompletionService
only manages an internal completion queue. The ExecutorCompletionService
class provides an implementation of this approach.
Memory consistency effects: Actions in a thread prior to submitting a task to a CompletionService
happen-before actions taken by that task, which in turn happen-before actions following a successful return from the corresponding take()
.