@ManagedObject(value="eat what you kill execution strategy") public class EatWhatYouKill extends ContainerLifeCycle implements ExecutionStrategy, java.lang.Runnable
A strategy where the thread that produces will run the resulting task if it is possible to do so without thread starvation.
This strategy preemptively dispatches a thread as a pending producer, so that when a thread produces a task it can immediately run the task and let the pending producer thread take over production. When operating in this way, the sub-strategy is called Execute Produce Consume (EPC).
However, if the task produced uses the Invocable API to indicate that
it will not block, then the strategy will run it directly, regardless of the
presence of a pending producer thread and then resume production after the
task has completed. When operating in this pattern, the sub-strategy is called
ProduceConsume (PC).
If there is no pending producer thread available and if the task has not indicated it is non-blocking, then this strategy will dispatch the execution of the task and immediately continue production. When operating in this pattern, the sub-strategy is called ProduceExecuteConsume (PEC).
| Modifier and Type | Class and Description |
|---|---|
private static class |
EatWhatYouKill.Mode |
private static class |
EatWhatYouKill.State |
AbstractLifeCycle.AbstractLifeCycleListenerExecutionStrategy.ProducerContainer.InheritedListener, Container.ListenerLifeCycle.Listener| Modifier and Type | Field and Description |
|---|---|
private java.util.concurrent.atomic.LongAdder |
_epcMode |
private java.util.concurrent.Executor |
_executor |
private java.util.concurrent.atomic.LongAdder |
_pcMode |
private java.util.concurrent.atomic.LongAdder |
_pecMode |
private boolean |
_pending |
private java.util.concurrent.atomic.LongAdder |
_picMode |
private ExecutionStrategy.Producer |
_producer |
private EatWhatYouKill.State |
_state |
private TryExecutor |
_tryExecutor |
private static Logger |
LOG |
| Constructor and Description |
|---|
EatWhatYouKill(ExecutionStrategy.Producer producer,
java.util.concurrent.Executor executor) |
| Modifier and Type | Method and Description |
|---|---|
void |
dispatch()
Initiates (or resumes) the task production and consumption.
|
private boolean |
doProduce(boolean nonBlocking) |
private void |
execute(java.lang.Runnable task) |
long |
getEPCTasksConsumed() |
long |
getPCTasksConsumed() |
long |
getPECTasksExecuted() |
long |
getPICTasksExecuted() |
private void |
getState(java.lang.StringBuilder builder) |
private void |
getString(java.lang.StringBuilder builder) |
private void |
invokeTask(java.lang.Runnable task) |
boolean |
isIdle() |
void |
produce()
Initiates (or resumes) the task production and consumption.
|
private java.lang.Runnable |
produceTask() |
void |
reset() |
void |
run() |
private void |
runTask(java.lang.Runnable task) |
java.lang.String |
toString() |
java.lang.String |
toStringLocked() |
private void |
tryProduce(boolean wasPending) |
addBean, addBean, addEventListener, addManaged, contains, destroy, doStart, doStop, dump, dump, dump, dump, dump, dumpBeans, dumpObject, dumpObjects, dumpStdErr, dumpThis, getBean, getBeans, getBeans, getContainedBeans, getContainedBeans, isAuto, isManaged, isUnmanaged, manage, removeBean, removeBeans, removeEventListener, setBeans, setStopTimeout, start, stop, unmanage, updateBean, updateBean, updateBeansaddLifeCycleListener, getState, getState, getStopTimeout, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stopclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitdumpContainer, dumpIterable, dumpMapEntries, dumpObjects, dumpSelf, namedprivate static final Logger LOG
private final java.util.concurrent.atomic.LongAdder _pcMode
private final java.util.concurrent.atomic.LongAdder _picMode
private final java.util.concurrent.atomic.LongAdder _pecMode
private final java.util.concurrent.atomic.LongAdder _epcMode
private final ExecutionStrategy.Producer _producer
private final java.util.concurrent.Executor _executor
private final TryExecutor _tryExecutor
private EatWhatYouKill.State _state
private boolean _pending
public EatWhatYouKill(ExecutionStrategy.Producer producer, java.util.concurrent.Executor executor)
public void dispatch()
ExecutionStrategyInitiates (or resumes) the task production and consumption.
This method guarantees that the task is never run by the thread that called this method.
TODO review the need for this (only used by HTTP2 push)dispatch in interface ExecutionStrategyExecutionStrategy.produce()public void run()
run in interface java.lang.Runnablepublic void produce()
ExecutionStrategyInitiates (or resumes) the task production and consumption.
The produced task may be run by the same thread that called this method.
produce in interface ExecutionStrategyExecutionStrategy.dispatch()private void tryProduce(boolean wasPending)
private boolean doProduce(boolean nonBlocking)
private void runTask(java.lang.Runnable task)
private void invokeTask(java.lang.Runnable task)
private java.lang.Runnable produceTask()
private void execute(java.lang.Runnable task)
@ManagedAttribute(value="number of tasks consumed with PC mode", readonly=true) public long getPCTasksConsumed()
@ManagedAttribute(value="number of tasks executed with PIC mode", readonly=true) public long getPICTasksExecuted()
@ManagedAttribute(value="number of tasks executed with PEC mode", readonly=true) public long getPECTasksExecuted()
@ManagedAttribute(value="number of tasks consumed with EPC mode", readonly=true) public long getEPCTasksConsumed()
@ManagedAttribute(value="whether this execution strategy is idle", readonly=true) public boolean isIdle()
@ManagedOperation(value="resets the task counts", impact="ACTION") public void reset()
public java.lang.String toString()
toString in class AbstractLifeCyclepublic java.lang.String toStringLocked()
private void getString(java.lang.StringBuilder builder)
private void getState(java.lang.StringBuilder builder)