- Direct Known Subclasses:
- JMXEnabledSharedExecutorPool
public class SharedExecutorPool
extends java.lang.Object
A pool of worker threads that are shared between all Executors created with it. Each executor is treated as a distinct
unit, with its own concurrency and task queue limits, but the threads that service the tasks on each executor are
free to hop between executors at will.
To keep producers from incurring unnecessary delays, once an executor is "spun up" (i.e. is processing tasks at a steady
rate), adding tasks to the executor often involves only placing the task on the work queue and updating the
task permits (which imposes our max queue length constraints). Only when it cannot be guaranteed the task will be serviced
promptly does the producer have to signal a thread itself to perform the work.
We do this by scheduling only if
The worker threads schedule themselves as far as possible: when they are assigned a task, they will attempt to spawn
a partner worker to service any other work outstanding on the queue (if any); once they have finished the task they
will either take another (if any remaining) and repeat this, or they will attempt to assign themselves to another executor
that does have tasks remaining. If both fail, it will enter a non-busy-spinning phase, where it will sleep for a short
random interval (based upon the number of threads in this mode, so that the total amount of non-sleeping time remains
approximately fixed regardless of the number of spinning threads), and upon waking up will again try to assign themselves
an executor with outstanding tasks to perform.