Class SameThreadExecutorService
- java.lang.Object
-
- java.util.concurrent.AbstractExecutorService
-
- org.awaitility.core.SameThreadExecutorService
-
- All Implemented Interfaces:
java.util.concurrent.Executor,java.util.concurrent.ExecutorService
class SameThreadExecutorService extends java.util.concurrent.AbstractExecutorServiceCreates an executor service that runs each task in the thread that invokesexecute/submit, as inThreadPoolExecutor.CallerRunsPolicyThis applies both to individually submitted tasks and to collections of tasks submitted viainvokeAllorinvokeAny. In the latter case, tasks will run serially on the calling thread. Tasks are run to completion before aFutureis returned to the caller (unless the executor has been shutdown).Although all tasks are immediately executed in the thread that submitted the task, this
ExecutorServiceimposes a small locking overhead on each task submission in order to implement shutdown and termination behavior.The implementation deviates from the
ExecutorServicespecification with regards to theshutdownNowmethod. First, "best-effort" with regards to canceling running tasks is implemented as "no-effort". No interrupts or other attempts are made to stop threads executing tasks. Second, the returned list will always be empty, as any submitted task is considered to have started execution. This applies also to tasks given toinvokeAllorinvokeAnywhich are pending serial execution, even the subset of the tasks that have not yet started execution. It is unclear from theExecutorServicespecification if these should be included, and it's much easier to implement the interpretation that they not be. Finally, a call toshutdownorshutdownNowmay result in concurrent calls toinvokeAll/invokeAnythrowing RejectedExecutionException, although a subset of the tasks may already have been executed.
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.locks.LocklockLock used whenever accessing the state variables (runningTasks, shutdown, terminationCondition) of the executorprivate intrunningTasksprivate booleanshutdownprivate java.util.concurrent.locks.ConditionterminationSignaled after the executor is shutdown and running tasks are done
-
Constructor Summary
Constructors Constructor Description SameThreadExecutorService()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanawaitTermination(long timeout, java.util.concurrent.TimeUnit unit)private voidendTask()Decrements the running task count.voidexecute(java.lang.Runnable command)booleanisShutdown()booleanisTerminated()voidshutdown()java.util.List<java.lang.Runnable>shutdownNow()private voidstartTask()Checks if the executor has been shut down and increments the running task count.
-
-
-
Field Detail
-
lock
private final java.util.concurrent.locks.Lock lock
Lock used whenever accessing the state variables (runningTasks, shutdown, terminationCondition) of the executor
-
termination
private final java.util.concurrent.locks.Condition termination
Signaled after the executor is shutdown and running tasks are done
-
runningTasks
private int runningTasks
-
shutdown
private boolean shutdown
-
-
Method Detail
-
execute
public void execute(java.lang.Runnable command)
-
isShutdown
public boolean isShutdown()
-
shutdown
public void shutdown()
-
shutdownNow
public java.util.List<java.lang.Runnable> shutdownNow()
-
isTerminated
public boolean isTerminated()
-
awaitTermination
public boolean awaitTermination(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException- Throws:
java.lang.InterruptedException
-
startTask
private void startTask()
Checks if the executor has been shut down and increments the running task count.- Throws:
java.util.concurrent.RejectedExecutionException- if the executor has been previously shutdown
-
endTask
private void endTask()
Decrements the running task count.
-
-