@GwtCompatible(emulated=true) public final class MoreExecutors extends Object
Modifier and Type | Method and Description |
---|---|
static void |
addDelayedShutdownHook(ExecutorService service,
long terminationTimeout,
TimeUnit timeUnit)
Add a shutdown hook to wait for thread completion in the given
service . |
static Executor |
directExecutor()
Returns an
Executor that runs each task in the thread that invokes execute , as in ThreadPoolExecutor.CallerRunsPolicy . |
static ExecutorService |
getExitingExecutorService(ThreadPoolExecutor executor)
Converts the given ThreadPoolExecutor into an ExecutorService that exits when the application
is complete.
|
static ExecutorService |
getExitingExecutorService(ThreadPoolExecutor executor,
long terminationTimeout,
TimeUnit timeUnit)
Converts the given ThreadPoolExecutor into an ExecutorService that exits when the application
is complete.
|
static ScheduledExecutorService |
getExitingScheduledExecutorService(ScheduledThreadPoolExecutor executor)
Converts the given ScheduledThreadPoolExecutor into a ScheduledExecutorService that exits when
the application is complete.
|
static ScheduledExecutorService |
getExitingScheduledExecutorService(ScheduledThreadPoolExecutor executor,
long terminationTimeout,
TimeUnit timeUnit)
Converts the given ScheduledThreadPoolExecutor into a ScheduledExecutorService that exits when
the application is complete.
|
static ListeningExecutorService |
listeningDecorator(ExecutorService delegate)
Creates an
ExecutorService whose submit and invokeAll methods submit
ListenableFutureTask instances to the given delegate executor. |
static ListeningScheduledExecutorService |
listeningDecorator(ScheduledExecutorService delegate)
Creates a
ScheduledExecutorService whose submit and invokeAll methods
submit ListenableFutureTask instances to the given delegate executor. |
static ListeningExecutorService |
newDirectExecutorService()
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 . |
static Executor |
newSequentialExecutor(Executor delegate)
Returns an
Executor that runs each task executed sequentially, such that no two tasks
are running concurrently. |
static ThreadFactory |
platformThreadFactory()
Returns a default thread factory used to create new threads.
|
static Executor |
sequentialExecutor(Executor delegate)
Deprecated.
Use
newSequentialExecutor(java.util.concurrent.Executor) . This method is scheduled for removal in January
2018. |
static boolean |
shutdownAndAwaitTermination(ExecutorService service,
long timeout,
TimeUnit unit)
Shuts down the given executor service gradually, first disabling new submissions and later, if
necessary, cancelling remaining tasks.
|
@Beta @GwtIncompatible public static ExecutorService getExitingExecutorService(ThreadPoolExecutor executor, long terminationTimeout, TimeUnit timeUnit)
This is mainly for fixed thread pools. See Executors.newFixedThreadPool(int)
.
executor
- the executor to modify to make sure it exits when the application is finishedterminationTimeout
- how long to wait for the executor to finish before terminating the
JVMtimeUnit
- unit of time for the time parameter@Beta @GwtIncompatible public static ScheduledExecutorService getExitingScheduledExecutorService(ScheduledThreadPoolExecutor executor, long terminationTimeout, TimeUnit timeUnit)
This is mainly for fixed thread pools. See Executors.newScheduledThreadPool(int)
.
executor
- the executor to modify to make sure it exits when the application is finishedterminationTimeout
- how long to wait for the executor to finish before terminating the
JVMtimeUnit
- unit of time for the time parameter@Beta @GwtIncompatible public static void addDelayedShutdownHook(ExecutorService service, long terminationTimeout, TimeUnit timeUnit)
service
.
This is useful if the given service uses daemon threads, and we want to keep the JVM from
exiting immediately on shutdown, instead giving these daemon threads a chance to terminate
normally.service
- ExecutorService which uses daemon threadsterminationTimeout
- how long to wait for the executor to finish before terminating the
JVMtimeUnit
- unit of time for the time parameter@Beta @GwtIncompatible public static ExecutorService getExitingExecutorService(ThreadPoolExecutor executor)
This method waits 120 seconds before continuing with JVM termination, even if the executor has not finished its work.
This is mainly for fixed thread pools. See Executors.newFixedThreadPool(int)
.
executor
- the executor to modify to make sure it exits when the application is finished@Beta @GwtIncompatible public static ScheduledExecutorService getExitingScheduledExecutorService(ScheduledThreadPoolExecutor executor)
This method waits 120 seconds before continuing with JVM termination, even if the executor has not finished its work.
This is mainly for fixed thread pools. See Executors.newScheduledThreadPool(int)
.
executor
- the executor to modify to make sure it exits when the application is finished@GwtIncompatible public static ListeningExecutorService newDirectExecutorService()
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.
public static Executor directExecutor()
Executor
that runs each task in the thread that invokes execute
, as in ThreadPoolExecutor.CallerRunsPolicy
.
This instance is equivalent to:
final class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}
This should be preferred to newDirectExecutorService()
because implementing the
ExecutorService
subinterface necessitates significant performance overhead.
@Beta @Deprecated @GwtIncompatible public static Executor sequentialExecutor(Executor delegate)
newSequentialExecutor(java.util.concurrent.Executor)
. This method is scheduled for removal in January
2018.Executor
that runs each task executed sequentially, such that no two tasks
are running concurrently. Submitted tasks have a happens-before order as defined in the Java
Language Specification.
The executor uses delegate
in order to execute
each task in
turn, and does not create any threads of its own.
After execution begins on a thread from the delegate
Executor
, tasks are
polled and executed from a task queue until there are no more tasks. The thread will not be
released until there are no more tasks to run.
If a task is submitted while a thread is executing tasks from the task queue, the thread will not be released until that submitted task is also complete.
Tasks are always started with the Thread in an uninterrupted state.
If the thread is interrupted while a task is running or before the thread is taken by the Executor:
delegate
Executor may process the interrupt.
RuntimeException
s thrown by tasks are simply logged and the executor keeps trucking.
If an Error
is thrown, the error will propagate and execution will stop until the next
time a task is submitted.
When an Error
is thrown by an executed task, previously submitted tasks may never
run. An attempt will be made to restart execution on the next call to execute
. If the
delegate
has begun to reject execution, the previously submitted tasks may never run,
despite not throwing a RejectedExecutionException synchronously with the call to execute
. If this behaviour is problematic, use an Executor with a single thread (e.g. Executors.newSingleThreadExecutor()
).
@Beta @GwtIncompatible public static Executor newSequentialExecutor(Executor delegate)
Executor
that runs each task executed sequentially, such that no two tasks
are running concurrently. Submitted tasks have a happens-before order as defined in the Java
Language Specification.
The executor uses delegate
in order to execute
each task in
turn, and does not create any threads of its own.
After execution begins on a thread from the delegate
Executor
, tasks are
polled and executed from a task queue until there are no more tasks. The thread will not be
released until there are no more tasks to run.
If a task is submitted while a thread is executing tasks from the task queue, the thread will not be released until that submitted task is also complete.
If a task is interrupted while a task is running:
delegate
Executor may process the interrupt.
RuntimeException
s thrown by tasks are simply logged and the executor keeps trucking.
If an Error
is thrown, the error will propagate and execution will stop until the next
time a task is submitted.
When an Error
is thrown by an executed task, previously submitted tasks may never
run. An attempt will be made to restart execution on the next call to execute
. If the
delegate
has begun to reject execution, the previously submitted tasks may never run,
despite not throwing a RejectedExecutionException synchronously with the call to execute
. If this behaviour is problematic, use an Executor with a single thread (e.g. Executors.newSingleThreadExecutor()
).
sequentialExecutor(Executor)
)@GwtIncompatible public static ListeningExecutorService listeningDecorator(ExecutorService delegate)
ExecutorService
whose submit
and invokeAll
methods submit
ListenableFutureTask
instances to the given delegate executor. Those methods, as well
as execute
and invokeAny
, are implemented in terms of calls to delegate.execute
. All other methods are forwarded unchanged to the delegate. This implies that
the returned ListeningExecutorService
never calls the delegate's submit
, invokeAll
, and invokeAny
methods, so any special handling of tasks must be implemented
in the delegate's execute
method or by wrapping the returned ListeningExecutorService
.
If the delegate executor was already an instance of ListeningExecutorService
, it is
returned untouched, and the rest of this documentation does not apply.
@GwtIncompatible public static ListeningScheduledExecutorService listeningDecorator(ScheduledExecutorService delegate)
ScheduledExecutorService
whose submit
and invokeAll
methods
submit ListenableFutureTask
instances to the given delegate executor. Those methods, as
well as execute
and invokeAny
, are implemented in terms of calls to delegate.execute
. All other methods are forwarded unchanged to the delegate. This implies that
the returned ListeningScheduledExecutorService
never calls the delegate's submit
, invokeAll
, and invokeAny
methods, so any special handling of tasks
must be implemented in the delegate's execute
method or by wrapping the returned ListeningScheduledExecutorService
.
If the delegate executor was already an instance of ListeningScheduledExecutorService
, it is returned untouched, and the rest of this
documentation does not apply.
@Beta @GwtIncompatible public static ThreadFactory platformThreadFactory()
On AppEngine, returns ThreadManager.currentRequestThreadFactory()
. Otherwise,
returns Executors.defaultThreadFactory()
.
@Beta @CanIgnoreReturnValue @GwtIncompatible public static boolean shutdownAndAwaitTermination(ExecutorService service, long timeout, TimeUnit unit)
The method takes the following steps:
ExecutorService.shutdown()
, disabling acceptance of new submitted tasks.
ExecutorService.shutdownNow()
, cancelling
pending tasks and interrupting running tasks.
If, at any step of the process, the calling thread is interrupted, the method calls ExecutorService.shutdownNow()
and returns.
service
- the ExecutorService
to shut downtimeout
- the maximum time to wait for the ExecutorService
to terminateunit
- the time unit of the timeout argumenttrue
if the ExecutorService
was terminated successfully, false
if the call timed out or was interruptedCopyright © 2010–2018. All rights reserved.