ThreadPoolExecutor (Java SE 9 & JDK 9 ) (original) (raw)
Nested Class Summary
Nested Classes
Modifier and Type Class Description static class ThreadPoolExecutor.AbortPolicy A handler for rejected tasks that throws aRejectedExecutionException. static class ThreadPoolExecutor.CallerRunsPolicy A handler for rejected tasks that runs the rejected task directly in the calling thread of the execute method, unless the executor has been shut down, in which case the task is discarded. static class ThreadPoolExecutor.DiscardOldestPolicy A handler for rejected tasks that discards the oldest unhandled request and then retries execute, unless the executor is shut down, in which case the task is discarded. static class ThreadPoolExecutor.DiscardPolicy A handler for rejected tasks that silently discards the rejected task. Constructor Summary
Constructors
Constructor Description ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) Creates a new ThreadPoolExecutor with the given initial parameters and default thread factory and rejected execution handler. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) Creates a new ThreadPoolExecutor with the given initial parameters and default thread factory. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory) Creates a new ThreadPoolExecutor with the given initial parameters and default rejected execution handler. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) Creates a new ThreadPoolExecutor with the given initial parameters. Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods
Modifier and Type Method Description protected void afterExecute(Runnable r,Throwable t) Method invoked upon completion of execution of the given Runnable. void allowCoreThreadTimeOut(boolean value) Sets the policy governing whether core threads may time out and terminate if no tasks arrive within the keep-alive time, being replaced if needed when new tasks arrive. boolean allowsCoreThreadTimeOut() Returns true if this pool allows core threads to time out and terminate if no tasks arrive within the keepAlive time, being replaced if needed when new tasks arrive. boolean awaitTermination(long timeout,TimeUnit unit) Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first. protected void beforeExecute(Thread t,Runnable r) Method invoked prior to executing the given Runnable in the given thread. void execute(Runnable command) Executes the given task sometime in the future. protected void finalize() Deprecated. int getActiveCount() Returns the approximate number of threads that are actively executing tasks. long getCompletedTaskCount() Returns the approximate total number of tasks that have completed execution. int getCorePoolSize() Returns the core number of threads. long getKeepAliveTime(TimeUnit unit) Returns the thread keep-alive time, which is the amount of time that threads may remain idle before being terminated. int getLargestPoolSize() Returns the largest number of threads that have ever simultaneously been in the pool. int getMaximumPoolSize() Returns the maximum allowed number of threads. int getPoolSize() Returns the current number of threads in the pool. BlockingQueue<Runnable> getQueue() Returns the task queue used by this executor. RejectedExecutionHandler getRejectedExecutionHandler() Returns the current handler for unexecutable tasks. long getTaskCount() Returns the approximate total number of tasks that have ever been scheduled for execution. ThreadFactory getThreadFactory() Returns the thread factory used to create new threads. boolean isShutdown() Returns true if this executor has been shut down. boolean isTerminated() Returns true if all tasks have completed following shut down. boolean isTerminating() Returns true if this executor is in the process of terminating after shutdown() or shutdownNow() but has not completely terminated. int prestartAllCoreThreads() Starts all core threads, causing them to idly wait for work. boolean prestartCoreThread() Starts a core thread, causing it to idly wait for work. void purge() Tries to remove from the work queue all Future tasks that have been cancelled. boolean remove(Runnable task) Removes this task from the executor's internal queue if it is present, thus causing it not to be run if it has not already started. void setCorePoolSize(int corePoolSize) Sets the core number of threads. void setKeepAliveTime(long time,TimeUnit unit) Sets the thread keep-alive time, which is the amount of time that threads may remain idle before being terminated. void setMaximumPoolSize(int maximumPoolSize) Sets the maximum allowed number of threads. void setRejectedExecutionHandler(RejectedExecutionHandler handler) Sets a new handler for unexecutable tasks. void setThreadFactory(ThreadFactory threadFactory) Sets the thread factory used to create new threads. void shutdown() Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. List<Runnable> shutdownNow() Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of the tasks that were awaiting execution. protected void terminated() Method invoked when the Executor has terminated. String toString() Returns a string identifying this pool, as well as its state, including indications of run state and estimated worker and task counts. * ### Methods inherited from class java.util.concurrent.[AbstractExecutorService](../../../java/util/concurrent/AbstractExecutorService.html "class in java.util.concurrent") `[invokeAll](../../../java/util/concurrent/AbstractExecutorService.html#invokeAll-java.util.Collection-), [invokeAll](../../../java/util/concurrent/AbstractExecutorService.html#invokeAll-java.util.Collection-long-java.util.concurrent.TimeUnit-), [invokeAny](../../../java/util/concurrent/AbstractExecutorService.html#invokeAny-java.util.Collection-), [invokeAny](../../../java/util/concurrent/AbstractExecutorService.html#invokeAny-java.util.Collection-long-java.util.concurrent.TimeUnit-), [newTaskFor](../../../java/util/concurrent/AbstractExecutorService.html#newTaskFor-java.lang.Runnable-T-), [newTaskFor](../../../java/util/concurrent/AbstractExecutorService.html#newTaskFor-java.util.concurrent.Callable-), [submit](../../../java/util/concurrent/AbstractExecutorService.html#submit-java.lang.Runnable-), [submit](../../../java/util/concurrent/AbstractExecutorService.html#submit-java.lang.Runnable-T-), [submit](../../../java/util/concurrent/AbstractExecutorService.html#submit-java.util.concurrent.Callable-)` * ### Methods inherited from class java.lang.[Object](../../../java/lang/Object.html "class in java.lang") `[clone](../../../java/lang/Object.html#clone--), [equals](../../../java/lang/Object.html#equals-java.lang.Object-), [getClass](../../../java/lang/Object.html#getClass--), [hashCode](../../../java/lang/Object.html#hashCode--), [notify](../../../java/lang/Object.html#notify--), [notifyAll](../../../java/lang/Object.html#notifyAll--), [wait](../../../java/lang/Object.html#wait--), [wait](../../../java/lang/Object.html#wait-long-), [wait](../../../java/lang/Object.html#wait-long-int-)`
Constructor Detail
* #### ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, [TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit, [BlockingQueue](../../../java/util/concurrent/BlockingQueue.html "interface in java.util.concurrent")<[Runnable](../../../java/lang/Runnable.html "interface in java.lang")> workQueue) Creates a new `ThreadPoolExecutor` with the given initial parameters and default thread factory and rejected execution handler. It may be more convenient to use one of the [Executors](../../../java/util/concurrent/Executors.html "class in java.util.concurrent") factory methods instead of this general purpose constructor. Parameters: `corePoolSize` \- the number of threads to keep in the pool, even if they are idle, unless `allowCoreThreadTimeOut` is set `maximumPoolSize` \- the maximum number of threads to allow in the pool `keepAliveTime` \- when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. `unit` \- the time unit for the `keepAliveTime` argument `workQueue` \- the queue to use for holding tasks before they are executed. This queue will hold only the `Runnable` tasks submitted by the `execute` method. Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if one of the following holds: `corePoolSize < 0` `keepAliveTime < 0` `maximumPoolSize <= 0` `maximumPoolSize < corePoolSize` `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if `workQueue` is null * #### ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, [TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit, [BlockingQueue](../../../java/util/concurrent/BlockingQueue.html "interface in java.util.concurrent")<[Runnable](../../../java/lang/Runnable.html "interface in java.lang")> workQueue, [ThreadFactory](../../../java/util/concurrent/ThreadFactory.html "interface in java.util.concurrent") threadFactory) Creates a new `ThreadPoolExecutor` with the given initial parameters and default rejected execution handler. Parameters: `corePoolSize` \- the number of threads to keep in the pool, even if they are idle, unless `allowCoreThreadTimeOut` is set `maximumPoolSize` \- the maximum number of threads to allow in the pool `keepAliveTime` \- when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. `unit` \- the time unit for the `keepAliveTime` argument `workQueue` \- the queue to use for holding tasks before they are executed. This queue will hold only the `Runnable` tasks submitted by the `execute` method. `threadFactory` \- the factory to use when the executor creates a new thread Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if one of the following holds: `corePoolSize < 0` `keepAliveTime < 0` `maximumPoolSize <= 0` `maximumPoolSize < corePoolSize` `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if `workQueue` or `threadFactory` is null * #### ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, [TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit, [BlockingQueue](../../../java/util/concurrent/BlockingQueue.html "interface in java.util.concurrent")<[Runnable](../../../java/lang/Runnable.html "interface in java.lang")> workQueue, [RejectedExecutionHandler](../../../java/util/concurrent/RejectedExecutionHandler.html "interface in java.util.concurrent") handler) Creates a new `ThreadPoolExecutor` with the given initial parameters and default thread factory. Parameters: `corePoolSize` \- the number of threads to keep in the pool, even if they are idle, unless `allowCoreThreadTimeOut` is set `maximumPoolSize` \- the maximum number of threads to allow in the pool `keepAliveTime` \- when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. `unit` \- the time unit for the `keepAliveTime` argument `workQueue` \- the queue to use for holding tasks before they are executed. This queue will hold only the `Runnable` tasks submitted by the `execute` method. `handler` \- the handler to use when execution is blocked because the thread bounds and queue capacities are reached Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if one of the following holds: `corePoolSize < 0` `keepAliveTime < 0` `maximumPoolSize <= 0` `maximumPoolSize < corePoolSize` `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if `workQueue` or `handler` is null * #### ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, [TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit, [BlockingQueue](../../../java/util/concurrent/BlockingQueue.html "interface in java.util.concurrent")<[Runnable](../../../java/lang/Runnable.html "interface in java.lang")> workQueue, [ThreadFactory](../../../java/util/concurrent/ThreadFactory.html "interface in java.util.concurrent") threadFactory, [RejectedExecutionHandler](../../../java/util/concurrent/RejectedExecutionHandler.html "interface in java.util.concurrent") handler) Creates a new `ThreadPoolExecutor` with the given initial parameters. Parameters: `corePoolSize` \- the number of threads to keep in the pool, even if they are idle, unless `allowCoreThreadTimeOut` is set `maximumPoolSize` \- the maximum number of threads to allow in the pool `keepAliveTime` \- when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. `unit` \- the time unit for the `keepAliveTime` argument `workQueue` \- the queue to use for holding tasks before they are executed. This queue will hold only the `Runnable` tasks submitted by the `execute` method. `threadFactory` \- the factory to use when the executor creates a new thread `handler` \- the handler to use when execution is blocked because the thread bounds and queue capacities are reached Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if one of the following holds: `corePoolSize < 0` `keepAliveTime < 0` `maximumPoolSize <= 0` `maximumPoolSize < corePoolSize` `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if `workQueue` or `threadFactory` or `handler` is null
Method Detail
* #### execute public void execute([Runnable](../../../java/lang/Runnable.html "interface in java.lang") command) Executes the given task sometime in the future. The task may execute in a new thread or in an existing pooled thread. If the task cannot be submitted for execution, either because this executor has been shutdown or because its capacity has been reached, the task is handled by the current `RejectedExecutionHandler`. Parameters: `command` \- the task to execute Throws: `[RejectedExecutionException](../../../java/util/concurrent/RejectedExecutionException.html "class in java.util.concurrent")` \- at discretion of`RejectedExecutionHandler`, if the task cannot be accepted for execution `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if `command` is null * #### shutdown public void shutdown() Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. Invocation has no additional effect if already shut down. This method does not wait for previously submitted tasks to complete execution. Use [awaitTermination](../../../java/util/concurrent/ThreadPoolExecutor.html#awaitTermination-long-java.util.concurrent.TimeUnit-) to do that. Throws: `[SecurityException](../../../java/lang/SecurityException.html "class in java.lang")` \- if a security manager exists and shutting down this ExecutorService may manipulate threads that the caller is not permitted to modify because it does not hold [RuntimePermission](../../../java/lang/RuntimePermission.html "class in java.lang")`("modifyThread")`, or the security manager's `checkAccess` method denies access. * #### shutdownNow public [List](../../../java/util/List.html "interface in java.util")<[Runnable](../../../java/lang/Runnable.html "interface in java.lang")> shutdownNow() Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of the tasks that were awaiting execution. These tasks are drained (removed) from the task queue upon return from this method. This method does not wait for actively executing tasks to terminate. Use [awaitTermination](../../../java/util/concurrent/ThreadPoolExecutor.html#awaitTermination-long-java.util.concurrent.TimeUnit-) to do that. There are no guarantees beyond best-effort attempts to stop processing actively executing tasks. This implementation interrupts tasks via [Thread.interrupt()](../../../java/lang/Thread.html#interrupt--); any task that fails to respond to interrupts may never terminate. Returns: list of tasks that never commenced execution Throws: `[SecurityException](../../../java/lang/SecurityException.html "class in java.lang")` \- if a security manager exists and shutting down this ExecutorService may manipulate threads that the caller is not permitted to modify because it does not hold [RuntimePermission](../../../java/lang/RuntimePermission.html "class in java.lang")`("modifyThread")`, or the security manager's `checkAccess` method denies access. * #### isShutdown public boolean isShutdown() Returns `true` if this executor has been shut down. Returns: `true` if this executor has been shut down * #### isTerminating public boolean isTerminating() Returns true if this executor is in the process of terminating after [shutdown()](../../../java/util/concurrent/ThreadPoolExecutor.html#shutdown--) or [shutdownNow()](../../../java/util/concurrent/ThreadPoolExecutor.html#shutdownNow--) but has not completely terminated. This method may be useful for debugging. A return of `true` reported a sufficient period after shutdown may indicate that submitted tasks have ignored or suppressed interruption, causing this executor not to properly terminate. Returns: `true` if terminating but not yet terminated * #### isTerminated public boolean isTerminated() Returns `true` if all tasks have completed following shut down. Note that `isTerminated` is never `true` unless either `shutdown` or `shutdownNow` was called first. Returns: `true` if all tasks have completed following shut down * #### awaitTermination public boolean awaitTermination(long timeout, [TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit) throws [InterruptedException](../../../java/lang/InterruptedException.html "class in java.lang") Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first. Parameters: `timeout` \- the maximum time to wait `unit` \- the time unit of the timeout argument Returns: `true` if this executor terminated and`false` if the timeout elapsed before termination Throws: `[InterruptedException](../../../java/lang/InterruptedException.html "class in java.lang")` \- if interrupted while waiting * #### finalize [@Deprecated](../../../java/lang/Deprecated.html "annotation in java.lang")([since](../../../java/lang/Deprecated.html#since--)="9") protected void finalize() Deprecated. Invokes `shutdown` when this executor is no longer referenced and it has no threads. This method is invoked with privileges that are restricted by the security context of the caller that invokes the constructor. Overrides: `[finalize](../../../java/lang/Object.html#finalize--)` in class `[Object](../../../java/lang/Object.html "class in java.lang")` See Also: [WeakReference](../../../java/lang/ref/WeakReference.html "class in java.lang.ref"), [PhantomReference](../../../java/lang/ref/PhantomReference.html "class in java.lang.ref") * #### setThreadFactory public void setThreadFactory([ThreadFactory](../../../java/util/concurrent/ThreadFactory.html "interface in java.util.concurrent") threadFactory) Sets the thread factory used to create new threads. Parameters: `threadFactory` \- the new thread factory Throws: `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if threadFactory is null See Also: [getThreadFactory()](../../../java/util/concurrent/ThreadPoolExecutor.html#getThreadFactory--) * #### getThreadFactory public [ThreadFactory](../../../java/util/concurrent/ThreadFactory.html "interface in java.util.concurrent") getThreadFactory() Returns the thread factory used to create new threads. Returns: the current thread factory See Also: [setThreadFactory(ThreadFactory)](../../../java/util/concurrent/ThreadPoolExecutor.html#setThreadFactory-java.util.concurrent.ThreadFactory-) * #### setRejectedExecutionHandler public void setRejectedExecutionHandler([RejectedExecutionHandler](../../../java/util/concurrent/RejectedExecutionHandler.html "interface in java.util.concurrent") handler) Sets a new handler for unexecutable tasks. Parameters: `handler` \- the new handler Throws: `[NullPointerException](../../../java/lang/NullPointerException.html "class in java.lang")` \- if handler is null See Also: [getRejectedExecutionHandler()](../../../java/util/concurrent/ThreadPoolExecutor.html#getRejectedExecutionHandler--) * #### getRejectedExecutionHandler public [RejectedExecutionHandler](../../../java/util/concurrent/RejectedExecutionHandler.html "interface in java.util.concurrent") getRejectedExecutionHandler() Returns the current handler for unexecutable tasks. Returns: the current handler See Also: [setRejectedExecutionHandler(RejectedExecutionHandler)](../../../java/util/concurrent/ThreadPoolExecutor.html#setRejectedExecutionHandler-java.util.concurrent.RejectedExecutionHandler-) * #### setCorePoolSize public void setCorePoolSize(int corePoolSize) Sets the core number of threads. This overrides any value set in the constructor. If the new value is smaller than the current value, excess existing threads will be terminated when they next become idle. If larger, new threads will, if needed, be started to execute any queued tasks. Parameters: `corePoolSize` \- the new core size Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if `corePoolSize < 0` or `corePoolSize` is greater than the [maximum pool size](../../../java/util/concurrent/ThreadPoolExecutor.html#getMaximumPoolSize--) See Also: [getCorePoolSize()](../../../java/util/concurrent/ThreadPoolExecutor.html#getCorePoolSize--) * #### getCorePoolSize public int getCorePoolSize() Returns the core number of threads. Returns: the core number of threads See Also: [setCorePoolSize(int)](../../../java/util/concurrent/ThreadPoolExecutor.html#setCorePoolSize-int-) * #### prestartCoreThread public boolean prestartCoreThread() Starts a core thread, causing it to idly wait for work. This overrides the default policy of starting core threads only when new tasks are executed. This method will return `false` if all core threads have already been started. Returns: `true` if a thread was started * #### prestartAllCoreThreads public int prestartAllCoreThreads() Starts all core threads, causing them to idly wait for work. This overrides the default policy of starting core threads only when new tasks are executed. Returns: the number of threads started * #### allowsCoreThreadTimeOut public boolean allowsCoreThreadTimeOut() Returns true if this pool allows core threads to time out and terminate if no tasks arrive within the keepAlive time, being replaced if needed when new tasks arrive. When true, the same keep-alive policy applying to non-core threads applies also to core threads. When false (the default), core threads are never terminated due to lack of incoming tasks. Returns: `true` if core threads are allowed to time out, else `false` Since: 1.6 * #### allowCoreThreadTimeOut public void allowCoreThreadTimeOut(boolean value) Sets the policy governing whether core threads may time out and terminate if no tasks arrive within the keep-alive time, being replaced if needed when new tasks arrive. When false, core threads are never terminated due to lack of incoming tasks. When true, the same keep-alive policy applying to non-core threads applies also to core threads. To avoid continual thread replacement, the keep-alive time must be greater than zero when setting `true`. This method should in general be called before the pool is actively used. Parameters: `value` \- `true` if should time out, else `false` Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if value is `true` and the current keep-alive time is not greater than zero Since: 1.6 * #### setMaximumPoolSize public void setMaximumPoolSize(int maximumPoolSize) Sets the maximum allowed number of threads. This overrides any value set in the constructor. If the new value is smaller than the current value, excess existing threads will be terminated when they next become idle. Parameters: `maximumPoolSize` \- the new maximum Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if the new maximum is less than or equal to zero, or less than the [core pool size](../../../java/util/concurrent/ThreadPoolExecutor.html#getCorePoolSize--) See Also: [getMaximumPoolSize()](../../../java/util/concurrent/ThreadPoolExecutor.html#getMaximumPoolSize--) * #### getMaximumPoolSize public int getMaximumPoolSize() Returns the maximum allowed number of threads. Returns: the maximum allowed number of threads See Also: [setMaximumPoolSize(int)](../../../java/util/concurrent/ThreadPoolExecutor.html#setMaximumPoolSize-int-) * #### setKeepAliveTime public void setKeepAliveTime(long time, [TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit) Sets the thread keep-alive time, which is the amount of time that threads may remain idle before being terminated. Threads that wait this amount of time without processing a task will be terminated if there are more than the core number of threads currently in the pool, or if this pool[allows core thread timeout](../../../java/util/concurrent/ThreadPoolExecutor.html#allowsCoreThreadTimeOut--). This overrides any value set in the constructor. Parameters: `time` \- the time to wait. A time value of zero will cause excess threads to terminate immediately after executing tasks. `unit` \- the time unit of the `time` argument Throws: `[IllegalArgumentException](../../../java/lang/IllegalArgumentException.html "class in java.lang")` \- if `time` less than zero or if `time` is zero and `allowsCoreThreadTimeOut` See Also: [getKeepAliveTime(TimeUnit)](../../../java/util/concurrent/ThreadPoolExecutor.html#getKeepAliveTime-java.util.concurrent.TimeUnit-) * #### getKeepAliveTime public long getKeepAliveTime([TimeUnit](../../../java/util/concurrent/TimeUnit.html "enum in java.util.concurrent") unit) Returns the thread keep-alive time, which is the amount of time that threads may remain idle before being terminated. Threads that wait this amount of time without processing a task will be terminated if there are more than the core number of threads currently in the pool, or if this pool[allows core thread timeout](../../../java/util/concurrent/ThreadPoolExecutor.html#allowsCoreThreadTimeOut--). Parameters: `unit` \- the desired time unit of the result Returns: the time limit See Also: [setKeepAliveTime(long, TimeUnit)](../../../java/util/concurrent/ThreadPoolExecutor.html#setKeepAliveTime-long-java.util.concurrent.TimeUnit-) * #### getQueue public [BlockingQueue](../../../java/util/concurrent/BlockingQueue.html "interface in java.util.concurrent")<[Runnable](../../../java/lang/Runnable.html "interface in java.lang")> getQueue() Returns the task queue used by this executor. Access to the task queue is intended primarily for debugging and monitoring. This queue may be in active use. Retrieving the task queue does not prevent queued tasks from executing. Returns: the task queue * #### remove public boolean remove([Runnable](../../../java/lang/Runnable.html "interface in java.lang") task) Removes this task from the executor's internal queue if it is present, thus causing it not to be run if it has not already started. This method may be useful as one part of a cancellation scheme. It may fail to remove tasks that have been converted into other forms before being placed on the internal queue. For example, a task entered using `submit` might be converted into a form that maintains `Future` status. However, in such cases, method [purge()](../../../java/util/concurrent/ThreadPoolExecutor.html#purge--) may be used to remove those Futures that have been cancelled. Parameters: `task` \- the task to remove Returns: `true` if the task was removed * #### purge public void purge() Tries to remove from the work queue all [Future](../../../java/util/concurrent/Future.html "interface in java.util.concurrent") tasks that have been cancelled. This method can be useful as a storage reclamation operation, that has no other impact on functionality. Cancelled tasks are never executed, but may accumulate in work queues until worker threads can actively remove them. Invoking this method instead tries to remove them now. However, this method may fail to remove tasks in the presence of interference by other threads. * #### getPoolSize public int getPoolSize() Returns the current number of threads in the pool. Returns: the number of threads * #### getActiveCount public int getActiveCount() Returns the approximate number of threads that are actively executing tasks. Returns: the number of threads * #### getLargestPoolSize public int getLargestPoolSize() Returns the largest number of threads that have ever simultaneously been in the pool. Returns: the number of threads * #### getTaskCount public long getTaskCount() Returns the approximate total number of tasks that have ever been scheduled for execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation. Returns: the number of tasks * #### getCompletedTaskCount public long getCompletedTaskCount() Returns the approximate total number of tasks that have completed execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation, but one that does not ever decrease across successive calls. Returns: the number of tasks * #### toString public [String](../../../java/lang/String.html "class in java.lang") toString() Returns a string identifying this pool, as well as its state, including indications of run state and estimated worker and task counts. Overrides: `[toString](../../../java/lang/Object.html#toString--)` in class `[Object](../../../java/lang/Object.html "class in java.lang")` Returns: a string identifying this pool, as well as its state * #### beforeExecute protected void beforeExecute([Thread](../../../java/lang/Thread.html "class in java.lang") t, [Runnable](../../../java/lang/Runnable.html "interface in java.lang") r) Method invoked prior to executing the given Runnable in the given thread. This method is invoked by thread `t` that will execute task `r`, and may be used to re-initialize ThreadLocals, or to perform logging. This implementation does nothing, but may be customized in subclasses. Note: To properly nest multiple overridings, subclasses should generally invoke `super.beforeExecute` at the end of this method. Parameters: `t` \- the thread that will run task `r` `r` \- the task that will be executed * #### afterExecute protected void afterExecute([Runnable](../../../java/lang/Runnable.html "interface in java.lang") r, [Throwable](../../../java/lang/Throwable.html "class in java.lang") t) Method invoked upon completion of execution of the given Runnable. This method is invoked by the thread that executed the task. If non-null, the Throwable is the uncaught `RuntimeException` or `Error` that caused execution to terminate abruptly. This implementation does nothing, but may be customized in subclasses. Note: To properly nest multiple overridings, subclasses should generally invoke `super.afterExecute` at the beginning of this method. **Note:** When actions are enclosed in tasks (such as[FutureTask](../../../java/util/concurrent/FutureTask.html "class in java.util.concurrent")) either explicitly or via methods such as`submit`, these task objects catch and maintain computational exceptions, and so they do not cause abrupt termination, and the internal exceptions are _not_ passed to this method. If you would like to trap both kinds of failures in this method, you can further probe for such cases, as in this sample subclass that prints either the direct cause or the underlying exception if a task has been aborted: ` class ExtendedExecutor extends ThreadPoolExecutor { // ... protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if (t == null && r instanceof Future<?> && ((Future<?>)r).isDone()) { try { Object result = ((Future<?>) r).get(); } catch (CancellationException ce) { t = ce; } catch (ExecutionException ee) { t = ee.getCause(); } catch (InterruptedException ie) { // ignore/reset Thread.currentThread().interrupt(); } } if (t != null) System.out.println(t); } }` Parameters: `r` \- the runnable that has completed `t` \- the exception that caused termination, or null if execution completed normally * #### terminated protected void terminated() Method invoked when the Executor has terminated. Default implementation does nothing. Note: To properly nest multiple overridings, subclasses should generally invoke`super.terminated` within this method.