public final class SingleThreadedExecutor extends DelegatedTaskExecutorService implements MonitorableTaskExecutorService
TaskExecutorService executing submitted tasks on a single
background thread. Tasks are guaranteed to be executed in a FIFO order and
they are never executed concurrently, so this class might be conveniently
used for synchronization purposes.
execute methods.
When a new task is submitted, SingleThreadedExecutor and the queue
of this executor is not full: The task is added to the queue. If the worker
thread of this executor has already been started, the worker will execute the
newly added task after it finishes executing previously submitted tasks.
If the queue for tasks is full, the submit or execute method
will block and wait until the task can be added to the queue.
Canceling a task will cause the CancellationToken passed to it,
signal cancellation request. In this case the task may decide if it is to be
canceled or not. If the task throws an OperationCanceledException,
task execution is considered to be canceled. Note that if the task throws
an OperationCanceledException it is always assumed to be canceled,
even if the CancellationToken does not signal a cancellation request.
SingleThreadedExecutor
at any given time is the maximum size of its queue plus one. The
SingleThreadedExecutor will never reference tasks more than this.
Note however, that not yet returned submit or execute methods
always reference their task specified in their argument (obviously this is
unavoidable) and there is no limit on how many times the user can
concurrently call these methods.
SingleThreadedExecutorSingleThreadedExecutor must always be shut down when no longer
needed, so that it may shutdown its worker thread. If the user fails to
shut down the SingleThreadedExecutor (either by calling
shutdown() or shutdownAndCancel()) and the garbage
collector notifies the SingleThreadedExecutor that it has become
unreachable (through finalizers), it will be logged as an error using the
logging facility of Java (in a Level.SEVERE log message).
wrappedExecutor| Constructor and Description |
|---|
SingleThreadedExecutor(String poolName)
Creates a new
SingleThreadedExecutor initialized with the
specified name. |
SingleThreadedExecutor(String poolName,
int maxQueueSize)
Creates a new
SingleThreadedExecutor initialized with the given
properties. |
SingleThreadedExecutor(String poolName,
int maxQueueSize,
long idleTimeout,
TimeUnit timeUnit)
Creates a new
SingleThreadedExecutor initialized with the given
properties. |
| Modifier and Type | Method and Description |
|---|---|
void |
dontNeedShutdown()
Specifies that this
SingleThreadedExecutor does not need to be
shut down. |
long |
getIdleTimeout(TimeUnit timeUnit)
Returns the currently set timeout value after idle threads should stop.
|
int |
getMaxQueueSize()
Returns the currently set maximum size for the queue of tasks scheduled
to be executed.
|
long |
getNumberOfExecutingTasks()
Returns the approximate number of tasks currently being executed.
|
long |
getNumberOfQueuedTasks()
Returns the approximate number of tasks currently queued to this
executor.
|
String |
getPoolName()
Returns the name of this
SingleThreadedExecutor as specified at
construction time. |
boolean |
isExecutingInThis()
Returns
true if the calling code is executing in the context of
this executor. |
void |
setIdleTimeout(long idleTimeout,
TimeUnit timeUnit)
Sets the timeout value after idle threads should terminate.
|
void |
setMaxQueueSize(int maxQueueSize)
Sets the maximum number of tasks allowed to be stored in the internal
queue.
|
void |
setThreadFactory(ThreadFactory threadFactory)
Sets the
ThreadFactory which is used to create worker threads
for this executor. |
void |
shutdown()
Shuts down this
TaskExecutorService, so that it will not execute
tasks submitted to it after this method call returns. |
void |
shutdownAndCancel()
Shuts down this
TaskExecutorService and cancels already
submitted tasks, so that it will not execute tasks submitted to it after
this method call returns. |
addTerminateListener, awaitTermination, execute, execute, executeFunction, executeStaged, isShutdown, isTerminated, toString, tryAwaitTerminationclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitaddTerminateListener, awaitTermination, isShutdown, isTerminated, tryAwaitTerminationexecute, execute, executeFunction, executeStagedpublic SingleThreadedExecutor(String poolName)
SingleThreadedExecutor initialized with the
specified name.
The default maximum queue size is Integer.MAX_VALUE making it
effectively unbounded.
The default timeout value after idle threads stop is 5 seconds.
The newly created SingleThreadedExecutor will not have any thread
started. Threads will only be started when submitting tasks
(as required).
The default ThreadFactory will create non-daemon threads and
the name of the started threads will contain the name of this executor.
poolName - the name of this SingleThreadedExecutor for
logging and debugging purposes. Setting a descriptive name might help
when debugging or reading logs. This argument cannot be null.IllegalArgumentException - thrown if an illegal value was specified
for any of the int argumentsNullPointerException - thrown if the specified name for this
SingleThreadedExecutor is nullsetThreadFactory(ThreadFactory)public SingleThreadedExecutor(String poolName, int maxQueueSize)
SingleThreadedExecutor initialized with the given
properties.
The default timeout value after idle threads stop is 5 seconds.
The newly created SingleThreadedExecutor will not have any thread
started. Threads will only be started when submitting tasks
(as required).
The default ThreadFactory will create non-daemon threads and
the name of the started threads will contain the name of this executor.
poolName - the name of this SingleThreadedExecutor for
logging and debugging purposes. Setting a descriptive name might help
when debugging or reading logs. This argument cannot be null.maxQueueSize - the maximum size of the internal queue to store tasks
not yet executed due to the worker thread being busy executing tasks.
This argument must greater than or equal to 1.IllegalArgumentException - thrown if an illegal value was specified
for any of the int argumentsNullPointerException - thrown if the specified name for this
SingleThreadedExecutor is nullsetThreadFactory(ThreadFactory)public SingleThreadedExecutor(String poolName, int maxQueueSize, long idleTimeout, TimeUnit timeUnit)
SingleThreadedExecutor initialized with the given
properties.
The newly created SingleThreadedExecutor will not have any thread
started. Threads will only be started when submitting tasks
(as required).
The default ThreadFactory will create non-daemon threads and
the name of the started threads will contain the name of this executor.
poolName - the name of this SingleThreadedExecutor for
logging and debugging purposes. Setting a descriptive name might help
when debugging or reading logs. This argument cannot be null.maxQueueSize - the maximum size of the internal queue to store tasks
not yet executed due to the worker thread being busy executing tasks.
This argument must greater than or equal to 1..idleTimeout - the time in the given time unit after idle threads
should stop. That is if a thread goes idle (i.e.: there are no
submitted tasks), it will wait this amount of time before giving up
waiting for submitted tasks. The thread may be restarted if needed
later. It is recommended to use a reasonably low value for this
argument (but not too low), so even if this
SingleThreadedExecutor is not shut down (due to a bug),
threads will still terminate allowing the JVM to terminate as well (if
there are no more non-daemon threads). This argument must be greater
than or equal to zero.timeUnit - the time unit of the idleTimeout argument. This
argument cannot be null.IllegalArgumentException - thrown if an illegal value was specified
for any of the int argumentsNullPointerException - thrown if any of the arguments is
nullsetThreadFactory(ThreadFactory)public void dontNeedShutdown()
SingleThreadedExecutor does not need to be
shut down. Calling this method prevents this executor to be shut
down automatically when there is no more reference to this executor,
which also prevents logging a message if this executor has not been shut
down. This method might be called if you do not plan to shutdown this
executor but instead want to rely on the threads of this executor to
automatically shutdown after a small timeout.public void shutdown()
TaskExecutorService, so that it will not execute
tasks submitted to it after this method call returns.
Already submitted tasks will execute normally but tasks submitted after
this method returns will immediately be completed exceptionally
with an OperationCanceledException.
Note that it is possible, that some tasks are submitted concurrently with this call. Those tasks can be either canceled or executed normally, depending on the circumstances.
If currently executing tasks should be canceled as well, use the
TaskExecutorService.shutdownAndCancel() method to shutdown this
TaskExecutorService.
This method call is idempotent. That is, calling it multiple times must have no further effect.
shutdown in interface TaskExecutorServiceshutdown in class DelegatedTaskExecutorServiceTaskExecutorService.shutdownAndCancel()public void shutdownAndCancel()
TaskExecutorService and cancels already
submitted tasks, so that it will not execute tasks submitted to it after
this method call returns.
Already submitted tasks will be canceled and the tasks may detect this
cancellation request by inspecting their CancellationToken but
tasks submitted after this method returns will immediately be completed
exceptionally with an OperationCanceledException.
Note that it is possible, that some tasks are submitted concurrently with this call. Those tasks may be treated as if they were submitted before this method call or as if they were submitted after.
If currently executing tasks should be left executing, use the
TaskExecutorService.shutdown() method instead to shutdown this
TaskExecutorService.
This method call is idempotent. That is, calling it multiple times must
have no further effect. Note however, that calling this method after the
shutdown() method is meaningful because this method will cancel
ongoing tasks.
shutdownAndCancel in interface TaskExecutorServiceshutdownAndCancel in class DelegatedTaskExecutorServiceTaskExecutorService.shutdown()public void setThreadFactory(ThreadFactory threadFactory)
ThreadFactory which is used to create worker threads
for this executor. Already started worker threads are not affected by
this method call but workers created after this method call will use the
currently set ThreadFactory.
It is recommended to call this method before submitting any task to this
executor. Doing so guarantees that all worker threads of this executor
will be created by the specified ThreadFactory.
threadFactory - the ThreadFactory which is used to create
worker threads for this executor. This argument cannot be null.NullPointerException - thrown if the specified thread factory is
nullpublic void setMaxQueueSize(int maxQueueSize)
Setting this property higher than it was set previously will have an
immediate effect and currently blocking submit and
execute will recheck if they can add the submitted task to the
queue. Setting this property lower, however, will not remove tasks from
the queue but will prevent more tasks to be added to the queue before
the number of tasks in the queue drops below this limit.
maxQueueSize - the maximum number of tasks allowed to be stored in
the internal queue. This argument must be greater than or equal to 1.IllegalArgumentException - if the specified maxQueueSize
is less than 1public int getMaxQueueSize()
The return value of this method is for information purpose only. Due to
concurrent sets and already queued tasks, there is no guarantee that
the return value is truly being honored at the moment. See
setMaxQueueSize for details on how this
property works.
public void setIdleTimeout(long idleTimeout,
TimeUnit timeUnit)
Setting this property has an immediate effect.
idleTimeout - the timeout value in the given time unit after idle
threads should terminate. This argument must be greater than or equal
to zero.timeUnit - the time unit of the idleTimeout argument.
This argument cannot be null.IllegalArgumentException - thrown if the specified timeout value is
less than zeroNullPointerException - thrown if the specified time unit argument
is nullpublic long getIdleTimeout(TimeUnit timeUnit)
The return value of this method is for information purpose only. Due to
concurrent sets, there is no guarantee that the return value is truly
being honored at the moment. See setIdleTimeout
for details on how this property works.
timeUnit - the time unit in which the result is request. This
argument cannot be null.setIdleTimeout due to rounding errors. This
method always returns a values greater than or equal to zero.NullPointerException - thrown if the specified time unit is
nullpublic String getPoolName()
SingleThreadedExecutor as specified at
construction time.SingleThreadedExecutor as specified at
construction time. This method never returns null.public long getNumberOfQueuedTasks()
Note that the value returned by this method should be considered unreliable and cannot be used for synchronization purposes.
getNumberOfQueuedTasks in interface MonitorableTaskExecutorpublic long getNumberOfExecutingTasks()
Note that the value returned by this method should be considered unreliable and cannot be used for synchronization purposes.
Implementation note: This method may only return zero or one.
getNumberOfExecutingTasks in interface MonitorableTaskExecutorpublic boolean isExecutingInThis()
true if the calling code is executing in the context of
this executor. That is, it is executed by a task submitted to this
executor.
This method can be used to check that a method call is executing in the context it was designed for.
isExecutingInThis in interface ContextAwareTaskExecutortrue if the calling code is executing in the context of
this executor, false otherwise