Class TestingExecutors


  • @Beta
    @GwtIncompatible
    public final class TestingExecutors
    extends Object
    Factory methods for ExecutorService for testing.
    Since:
    14.0
    Author:
    Chris Nokleberg
    • Method Detail

      • noOpScheduledExecutor

        public static com.google.common.util.concurrent.ListeningScheduledExecutorService noOpScheduledExecutor()
        Returns a ScheduledExecutorService that never executes anything.

        The shutdownNow method of the returned executor always returns an empty list despite the fact that everything is still technically awaiting execution. The getDelay method of any ScheduledFuture returned by the executor will always return the max long value instead of the time until the user-specified delay.

      • sameThreadScheduledExecutor

        public static com.google.common.util.concurrent.testing.SameThreadScheduledExecutorService sameThreadScheduledExecutor()
        Creates a scheduled executor service that runs each task in the thread that invokes execute/submit/schedule, as in CallerRunsPolicy. This applies both to individually submitted tasks and to collections of tasks submitted via invokeAll, invokeAny, schedule, scheduleAtFixedRate, and scheduleWithFixedDelay. In the case of tasks submitted by invokeAll or invokeAny, 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).

        The returned executor is backed by the executor returned by MoreExecutors.newDirectExecutorService() and subject to the same constraints.

        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.

        Because of the nature of single-thread execution, the methods scheduleAtFixedRate and scheduleWithFixedDelay are not supported by this class and will throw an UnsupportedOperationException.

        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.

        Since:
        15.0