- 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)修改或替换用于执行可调用的任务。voidexecute(Runnable command)执行command,所需延迟为零。booleangetContinueExistingPeriodicTasksAfterShutdownPolicy()获取有关是否继续执行现有定期任务的策略,即使此执行程序已为shutdown。booleangetExecuteExistingDelayedTasksAfterShutdownPolicy()获取有关是否执行现有延迟任务的策略,即使此执行程序已为shutdown。BlockingQueue<Runnable>getQueue()返回此执行程序使用的任务队列。booleangetRemoveOnCancelPolicy()获取有关是否应在取消时立即从工作队列中删除已取消任务的策略。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)提交在给定的初始延迟之后首先启用的定期动作,并且随后在一次执行的终止和下一次执行的开始之间给定延迟。voidsetContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value)设置是否继续执行现有周期性任务的策略,即使此执行程序已为shutdown。voidsetExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value)设置是否执行现有延迟任务的策略,即使此执行程序已为shutdown。voidsetRemoveOnCancelPolicy(boolean value)设置关于是否应在取消时立即从工作队列中删除已取消任务的策略。voidshutdown()启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。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:
-
submitin 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。- 结果
-
trueif将在关机后执行 - 另请参见:
-
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 - 结果
- 任务队列
-
-