Class SameThreadExecutorService

java.lang.Object
java.util.concurrent.AbstractExecutorService
org.awaitility.core.SameThreadExecutorService
All Implemented Interfaces:
Executor, ExecutorService

class SameThreadExecutorService extends AbstractExecutorService
Creates an executor service that runs each task in the thread that invokes execute/submit, as in ThreadPoolExecutor.CallerRunsPolicy This applies both to individually submitted tasks and to collections of tasks submitted via invokeAll or invokeAny. In the latter case, tasks will run serially on the calling thread. Tasks are run to completion before a Future is returned to the caller (unless the executor has been shutdown).

Although all tasks are immediately executed in the thread that submitted the task, this ExecutorService imposes a small locking overhead on each task submission in order to implement shutdown and termination behavior.

The implementation deviates from the ExecutorService specification with regards to the shutdownNow method. 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 to invokeAll or invokeAny which are pending serial execution, even the subset of the tasks that have not yet started execution. It is unclear from the ExecutorService specification if these should be included, and it's much easier to implement the interpretation that they not be. Finally, a call to shutdown or shutdownNow may result in concurrent calls to invokeAll/invokeAny throwing RejectedExecutionException, although a subset of the tasks may already have been executed.

  • Field Details

    • lock

      private final Lock lock
      Lock used whenever accessing the state variables (runningTasks, shutdown, terminationCondition) of the executor
    • termination

      private final Condition termination
      Signaled after the executor is shutdown and running tasks are done
    • runningTasks

      private int runningTasks
    • shutdown

      private boolean shutdown
  • Constructor Details

    • SameThreadExecutorService

      SameThreadExecutorService()
  • Method Details

    • execute

      public void execute(Runnable command)
    • isShutdown

      public boolean isShutdown()
    • shutdown

      public void shutdown()
    • shutdownNow

      public List<Runnable> shutdownNow()
    • isTerminated

      public boolean isTerminated()
    • awaitTermination

      public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
      Throws:
      InterruptedException
    • startTask

      private void startTask()
      Checks if the executor has been shut down and increments the running task count.
      Throws:
      RejectedExecutionException - if the executor has been previously shutdown
    • endTask

      private void endTask()
      Decrements the running task count.