- java.lang.Object
-
- java.util.concurrent.AbstractExecutorService
-
- java.util.concurrent.ThreadPoolExecutor
-
- java.util.concurrent.ScheduledThreadPoolExecutor
-
- 实现的所有接口
-
Executor
,ExecutorService
,ScheduledExecutorService
public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService
ThreadPoolExecutor
,可以额外安排命令在给定延迟后运行,或定期执行。 该类优选的是Timer
需要多个工作线程时,或当附加灵活性或能力ThreadPoolExecutor
需要(这此类扩展)。延迟任务在启用后立即执行,但没有任何实时保证,启用它们后何时启动它们。 按照先进先出(FIFO)提交顺序启用计划完全相同执行时间的任务。
在提交的任务在运行之前取消时,将禁止执行。 默认情况下,此类已取消的任务不会自动从工作队列中删除,直到其延迟过去。 虽然这可以进一步检查和监控,但也可能导致取消任务的无限制保留。 要避免这种情况,请使用
setRemoveOnCancelPolicy(boolean)
使任务在取消时立即从工作队列中删除。通过
scheduleAtFixedRate
或scheduleWithFixedDelay
安排的定期任务的连续执行不会重叠。 虽然可以通过不同的线程执行不同的执行,但是先前执行的效果可以通过后续执行的效果来执行happen-before 。虽然这个类继承自
ThreadPoolExecutor
,但是一些继承的调优方法对它没用 。 特别是,因为它使用corePoolSize
线程和无界队列作为固定大小的池,所以对maximumPoolSize
调整没有任何有用的效果。 此外,将corePoolSize
设置为零或使用allowCoreThreadTimeOut
几乎绝不是一个好主意,因为一旦它们有资格运行,这可能会使没有线程的池无法处理任务。与
ThreadPoolExecutor
,如果没有另外指定,则此类使用Executors.defaultThreadFactory()
作为默认线程工厂,并使用ThreadPoolExecutor.AbortPolicy
作为默认拒绝执行处理程序。扩展注释:此类重写
execute
和submit
方法,以生成内部ScheduledFuture
对象,以控制每个任务的延迟和调度。 为了保留功能,子类中这些方法的任何进一步覆盖必须调用超类版本,这有效地禁用了其他任务自定义。 然而,此类提供替代保护扩展方法decorateTask
(每一个用于一个版本Runnable
和Callable
),其可以被用于定制用于执行经由输入的命令的具体任务类型execute
,submit
,schedule
,scheduleAtFixedRate
,和scheduleWithFixedDelay
。 默认情况下,ScheduledThreadPoolExecutor
使用扩展FutureTask
的任务类型。 但是,可以使用以下形式的子类来修改或替换它:public class CustomScheduledExecutor extends ScheduledThreadPoolExecutor { static class CustomTask<V> implements RunnableScheduledFuture<V> { ... } protected <V> RunnableScheduledFuture<V> decorateTask( Runnable r, RunnableScheduledFuture<V> task) { return new CustomTask<V>(r, task); } protected <V> RunnableScheduledFuture<V> decorateTask( Callable<V> c, RunnableScheduledFuture<V> task) { return new CustomTask<V>(c, task); } // ... add constructors, etc. }
- 从以下版本开始:
- 1.5
-
-
嵌套类汇总
-
嵌套类/接口声明在类 java.util.concurrent.ThreadPoolExecutor
ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy
-
-
构造方法摘要
构造方法 构造器 描述 ScheduledThreadPoolExecutor(int corePoolSize)
使用给定的核心池大小创建新的ScheduledThreadPoolExecutor
。ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler)
使用给定的初始参数创建新的ScheduledThreadPoolExecutor
。ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory)
使用给定的初始参数创建新的ScheduledThreadPoolExecutor
。ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler)
使用给定的初始参数创建新的ScheduledThreadPoolExecutor
。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 protected <V> RunnableScheduledFuture<V>
decorateTask(Runnable runnable, RunnableScheduledFuture<V> task)
修改或替换用于执行runnable的任务。protected <V> RunnableScheduledFuture<V>
decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task)
修改或替换用于执行可调用的任务。void
execute(Runnable command)
执行command
,所需延迟为零。boolean
getContinueExistingPeriodicTasksAfterShutdownPolicy()
获取有关是否继续执行现有定期任务的策略,即使此执行程序已为shutdown
。boolean
getExecuteExistingDelayedTasksAfterShutdownPolicy()
获取有关是否执行现有延迟任务的策略,即使此执行程序已为shutdown
。BlockingQueue<Runnable>
getQueue()
返回此执行程序使用的任务队列。boolean
getRemoveOnCancelPolicy()
获取有关是否应在取消时立即从工作队列中删除已取消任务的策略。ScheduledFuture<?>
schedule(Runnable command, long delay, TimeUnit unit)
提交在给定延迟后启用的一次性任务。<V> ScheduledFuture<V>
schedule(Callable<V> callable, long delay, TimeUnit unit)
提交一个返回值的一次性任务,该任务在给定的延迟后变为启用状态。ScheduledFuture<?>
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
提交定期操作,该操作在给定的初始延迟后首先启用,随后在给定的时间段内启用; 也就是说,执行将在initialDelay
之后开始,然后是initialDelay + period
,然后是initialDelay + 2 * period
,依此类推。ScheduledFuture<?>
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
提交在给定的初始延迟之后首先启用的定期动作,并且随后在一次执行的终止和下一次执行的开始之间给定延迟。void
setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value)
设置是否继续执行现有周期性任务的策略,即使此执行程序已为shutdown
。void
setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value)
设置是否执行现有延迟任务的策略,即使此执行程序已为shutdown
。void
setRemoveOnCancelPolicy(boolean value)
设置关于是否应在取消时立即从工作队列中删除已取消任务的策略。void
shutdown()
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。List<Runnable>
shutdownNow()
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。Future<?>
submit(Runnable task)
提交Runnable任务以执行并返回表示该任务的Future。<T> Future<T>
submit(Runnable task, T result)
提交Runnable任务以执行并返回表示该任务的Future。<T> Future<T>
submit(Callable<T> task)
提交值返回任务以执行并返回表示任务的挂起结果的Future。-
声明方法的类 java.util.concurrent.ThreadPoolExecutor
afterExecute, allowCoreThreadTimeOut, allowsCoreThreadTimeOut, beforeExecute, finalize, getActiveCount, getCompletedTaskCount, getCorePoolSize, getKeepAliveTime, getLargestPoolSize, getMaximumPoolSize, getPoolSize, getRejectedExecutionHandler, getTaskCount, getThreadFactory, isTerminating, prestartAllCoreThreads, prestartCoreThread, purge, remove, setCorePoolSize, setKeepAliveTime, setMaximumPoolSize, setRejectedExecutionHandler, setThreadFactory, terminated, toString
-
声明方法的类 java.util.concurrent.AbstractExecutorService
newTaskFor, newTaskFor
-
声明方法的接口 java.util.concurrent.ExecutorService
awaitTermination, invokeAll, invokeAll, invokeAny, invokeAny, isShutdown, isTerminated
-
-
-
-
构造方法详细信息
-
ScheduledThreadPoolExecutor
public ScheduledThreadPoolExecutor(int corePoolSize)
使用给定的核心池大小创建新的ScheduledThreadPoolExecutor
。- 参数
-
corePoolSize
- 池中保留的线程数,即使它们处于空闲状态,除非allowCoreThreadTimeOut
为allowCoreThreadTimeOut
- 异常
-
IllegalArgumentException
- 如果corePoolSize < 0
-
ScheduledThreadPoolExecutor
public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory)
使用给定的初始参数创建新的ScheduledThreadPoolExecutor
。- 参数
-
corePoolSize
- 池中保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut
-
threadFactory
- 执行程序创建新线程时使用的工厂 - 异常
-
IllegalArgumentException
- 如果corePoolSize < 0
-
NullPointerException
- 如果threadFactory
为空
-
ScheduledThreadPoolExecutor
public ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler)
使用给定的初始参数创建新的ScheduledThreadPoolExecutor
。- 参数
-
corePoolSize
- 池中保留的线程数,即使它们处于空闲状态,除非allowCoreThreadTimeOut
为allowCoreThreadTimeOut
-
handler
- 由于达到线程边界和队列容量而阻止执行时使用的处理程序 - 异常
-
IllegalArgumentException
- 如果corePoolSize < 0
-
NullPointerException
- 如果handler
为空
-
ScheduledThreadPoolExecutor
public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler)
使用给定的初始参数创建新的ScheduledThreadPoolExecutor
。- 参数
-
corePoolSize
- 池中保留的线程数,即使它们处于空闲状态,除非allowCoreThreadTimeOut
为allowCoreThreadTimeOut
-
threadFactory
- 执行程序创建新线程时使用的工厂 -
handler
- 由于达到线程边界和队列容量而阻止执行时使用的处理程序 - 异常
-
IllegalArgumentException
- 如果corePoolSize < 0
-
NullPointerException
- 如果threadFactory
或handler
为空
-
-
方法详细信息
-
decorateTask
protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task)
修改或替换用于执行runnable的任务。 此方法可用于覆盖用于管理内部任务的具体类。 默认实现只返回给定的任务。- 参数类型
-
V
- 任务结果的类型 - 参数
-
runnable
- 提交的Runnable -
task
- 为执行runnable而创建的任务 - 结果
- 一个可以执行runnable的任务
- 从以下版本开始:
- 1.6
-
decorateTask
protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task)
修改或替换用于执行可调用的任务。 此方法可用于覆盖用于管理内部任务的具体类。 默认实现只返回给定的任务。- 参数类型
-
V
- 任务结果的类型 - 参数
-
callable
- 提交的Callable -
task
- 为执行可调用而创建的任务 - 结果
- 一个可以执行可调用的任务
- 从以下版本开始:
- 1.6
-
schedule
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
从界面复制的说明:ScheduledExecutorService
提交在给定延迟后启用的一次性任务。- Specified by:
-
schedule
在界面ScheduledExecutorService
- 参数
-
command
- 要执行的任务 -
delay
- 从现在起延迟执行的时间 -
unit
- 延迟参数的时间单位 - 结果
-
表示任务未完成的ScheduledFuture,其
get()
方法将在完成时返回null
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果命令或单位为空
-
schedule
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
从界面复制的说明:ScheduledExecutorService
提交一个返回值的一次性任务,该任务在给定的延迟后变为启用状态。- Specified by:
-
schedule
在界面ScheduledExecutorService
- 参数类型
-
V
- 可调用结果的类型 - 参数
-
callable
- 要执行的函数 -
delay
- 从现在起延迟执行的时间 -
unit
- 延迟参数的时间单位 - 结果
- ScheduledFuture,可用于提取结果或取消
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果可调用或单位为空
-
scheduleAtFixedRate
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
提交定期操作,该操作在给定的初始延迟后首先启用,随后在给定的时间段内启用; 也就是说,执行将在initialDelay
之后开始,然后是initialDelay + period
,然后是initialDelay + 2 * period
,依此类推。任务执行的顺序将无限期地继续,直到发生以下异常完成之一:
- 通过返回的未来任务是explicitly cancelled 。
- 调用方法
shutdown()
并且未将policy on whether to continue after shutdown设置为true,或调用方法shutdownNow()
; 也导致任务取消。 - 执行任务会引发异常。 在这种情况下,对返回的未来调用
get
将抛出ExecutionException
,将异常作为其原因。
isDone()
将返回true
。如果此任务的执行时间超过其周期,则后续执行可能会延迟,但不会同时执行。
- Specified by:
-
scheduleAtFixedRate
在界面ScheduledExecutorService
- 参数
-
command
- 要执行的任务 -
initialDelay
- 延迟首次执行的时间 -
period
- 连续执行之间的时间间隔 -
unit
- initialDelay和period参数的时间单位 - 结果
-
ScheduledFuture表示一系列重复任务的待完成。
未来的
get()
方法永远不会正常返回,并且会在任务取消或任务执行异常终止时抛出异常。 - 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果命令或单位为空 -
IllegalArgumentException
- 如果周期小于或等于零
-
scheduleWithFixedDelay
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
提交在给定的初始延迟之后首先启用的定期动作,并且随后在一次执行的终止和下一次执行的开始之间给定延迟。任务执行的顺序将无限期地继续,直到发生以下异常完成之一:
- 通过返回的未来任务是explicitly cancelled 。
- 方法
shutdown()
被称为和policy on whether to continue after shutdown未设置为真,或方法shutdownNow()
被调用; 也导致任务取消。 - 执行任务会引发异常。 在这种情况下,对返回的未来调用
get
将抛出ExecutionException
,将异常作为其原因。
isDone()
将返回true
。- Specified by:
-
scheduleWithFixedDelay
在界面ScheduledExecutorService
- 参数
-
command
- 要执行的任务 -
initialDelay
- 延迟首次执行的时间 -
delay
- 一次执行终止与下一次执行开始之间的延迟 -
unit
- initialDelay和delay参数的时间单位 - 结果
-
ScheduledFuture表示一系列重复任务的待完成。
未来的
get()
方法永远不会正常返回,并且会在任务取消或任务执行异常终止时抛出异常。 - 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果命令或单位为空 -
IllegalArgumentException
- 如果延迟小于或等于零
-
execute
public void execute(Runnable command)
执行command
,所需延迟为零。 这相当于schedule(command, 0, anyUnit)
。 请注意,检查队列和shutdownNow
返回的列表将访问零延迟ScheduledFuture
,而不是command
本身。使用的后果
ScheduledFuture
对象是afterExecute
总是调用空第二Throwable
说法,即使command
突然终止。 相反,Throwable
类任务抛出的Throwable
可以通过Future.get()
获得。- Specified by:
-
execute
在界面Executor
- 重写:
-
execute
类ThreadPoolExecutor
- 参数
-
command
- 要执行的任务 - 异常
-
RejectedExecutionException
- 由RejectedExecutionHandler
自行决定,如果由于执行人已被关闭而无法执行任务 -
NullPointerException
- 如果command
为空
-
submit
public Future<?> submit(Runnable task)
从界面复制的说明:ExecutorService
提交Runnable任务以执行并返回表示该任务的Future。 成功完成后,Future的get
方法将返回null
。- Specified by:
-
submit
在界面ExecutorService
- 重写:
-
submit
在类AbstractExecutorService
- 参数
-
task
- 要提交的任务 - 结果
- 表示未完成任务的Future
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为空
-
submit
public <T> Future<T> submit(Runnable task, T result)
从界面复制的说明:ExecutorService
提交Runnable任务以执行并返回表示该任务的Future。 Future'sget
方法将在成功完成后返回给定结果。- Specified by:
-
submit
in interfaceExecutorService
- 重写:
-
submit
类AbstractExecutorService
- 参数类型
-
T
- 结果的类型 - 参数
-
task
- 要提交的任务 -
result
- 要返回的结果 - 结果
- 表示未完成任务的Future
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为空
-
submit
public <T> Future<T> submit(Callable<T> task)
从界面复制的说明:ExecutorService
提交值返回任务以执行并返回表示任务的挂起结果的Future。 Future的get
方法将在成功完成后返回任务的结果。如果您想立即阻止等待任务,可以使用
result = exec.submit(aCallable).get();
表单的result = exec.submit(aCallable).get();
注意:
Executors
类包含一组方法,可以将一些其他常见的类似闭包的对象(例如,PrivilegedAction
)转换为Callable
表单,以便可以提交它们。- Specified by:
-
submit
在界面ExecutorService
- 重写:
-
submit
类AbstractExecutorService
- 参数类型
-
T
- 任务结果的类型 - 参数
-
task
- 要提交的任务 - 结果
- 表示未完成任务的Future
- 异常
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为空
-
setContinueExistingPeriodicTasksAfterShutdownPolicy
public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value)
设置是否继续执行现有周期性任务的策略,即使此执行程序已为shutdown
。 在这种情况下,执行将持续到shutdownNow
或者已经关闭时策略设置为false
。 默认情况下,此值为false
。- 参数
-
value
- 如果true
,关机后继续,否则不要 - 另请参见:
-
getContinueExistingPeriodicTasksAfterShutdownPolicy()
-
getContinueExistingPeriodicTasksAfterShutdownPolicy
public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy()
获取有关是否继续执行现有定期任务的策略,即使此执行程序已为shutdown
。 在这种情况下,执行将持续到shutdownNow
或者已经关闭时策略设置为false
。 默认情况下,此值为false
。- 结果
-
true
如果在关机后继续 - 另请参见:
-
setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean)
-
setExecuteExistingDelayedTasksAfterShutdownPolicy
public void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value)
设置是否执行现有延迟任务的策略,即使此执行程序已为shutdown
。 在这种情况下,这些任务将仅在shutdownNow
终止,或者在已经关闭时将策略设置为false
之后终止。 默认情况下,此值为true
。- 参数
-
value
- 如果是true
,请在关机后执行,否则不执行 - 另请参见:
-
getExecuteExistingDelayedTasksAfterShutdownPolicy()
-
getExecuteExistingDelayedTasksAfterShutdownPolicy
public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy()
获取有关是否执行现有延迟任务的策略,即使此执行程序已为shutdown
。 在这种情况下,这些任务仅在shutdownNow
终止,或者在已经关闭时将策略设置为false
之后终止。 默认情况下,此值为true
。- 结果
-
true
if将在关机后执行 - 另请参见:
-
setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean)
-
setRemoveOnCancelPolicy
public void setRemoveOnCancelPolicy(boolean value)
设置关于是否应在取消时立即从工作队列中删除已取消任务的策略。 默认false
。- 参数
-
value
- 如果是true
,取消时取消,否则不要 - 从以下版本开始:
- 1.7
- 另请参见:
-
getRemoveOnCancelPolicy()
-
getRemoveOnCancelPolicy
public boolean getRemoveOnCancelPolicy()
获取有关是否应在取消时立即从工作队列中删除已取消任务的策略。 默认情况下,此值为false
。- 结果
-
true
如果已立即从队列中删除已取消的任务 - 从以下版本开始:
- 1.7
- 另请参见:
-
setRemoveOnCancelPolicy(boolean)
-
shutdown
public void shutdown()
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有其他影响。此方法不会等待先前提交的任务完成执行。 使用
awaitTermination
来做到这一点。如果
ExecuteExistingDelayedTasksAfterShutdownPolicy
设置为false
,则会取消现有延迟尚未false
的延迟任务。 除非ContinueExistingPeriodicTasksAfterShutdownPolicy
已设置为true
,否则将取消现有周期性任务的后续执行。- Specified by:
-
shutdown
在界面ExecutorService
- 重写:
-
shutdown
类ThreadPoolExecutor
- 异常
-
SecurityException
- 如果存在安全管理器并且关闭此ExecutorService可能会操纵不允许调用者修改的线程,因为它不存在RuntimePermission
("modifyThread")
,或者安全管理器的checkAccess
方法拒绝访问。
-
shutdownNow
public List<Runnable> shutdownNow()
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 从此方法返回时,这些任务将从任务队列中排空(删除)。此方法不等待主动执行任务终止。 使用
awaitTermination
来做到这一点。除了尽力尝试停止处理主动执行任务之外,没有任何保证。 此实现通过
Thread.interrupt()
中断任务; 任何未能响应中断的任务都可能永远不会终止。- Specified by:
-
shutdownNow
在界面ExecutorService
- 重写:
-
shutdownNow
在类ThreadPoolExecutor
- 结果
-
从未开始执行的任务列表。
此列表中的每个元素都是
ScheduledFuture
。 对于通过schedule
方法之一提交的任务,该元素将与返回的ScheduledFuture
相同。 对于使用execute
提交的任务,该元素将为零延迟ScheduledFuture
。 - 异常
-
SecurityException
- 如果存在安全管理器并且关闭此ExecutorService可能会操纵不允许调用者修改的线程,因为它不能保留RuntimePermission
("modifyThread")
,或者安全管理器的checkAccess
方法拒绝访问。
-
getQueue
public BlockingQueue<Runnable> getQueue()
返回此执行程序使用的任务队列。 对任务队列的访问主要用于调试和监视。 此队列可能正在使用中。 检索任务队列不会阻止排队的任务执行。此队列的每个元素都是
ScheduledFuture
。 对于通过schedule
方法之一提交的任务,该元素将与返回的ScheduledFuture
相同。 对于使用execute
提交的任务,该元素将为零延迟ScheduledFuture
。不保证对此队列的迭代按其执行顺序遍历任务。
- 重写:
-
getQueue
类ThreadPoolExecutor
- 结果
- 任务队列
-
-