前言
相关系列
- 《Java & Executor & 目录》
- 《Java & Executor & ScheduledThreadPoolExecutor & 源码》
- 《Java & Executor & ScheduledThreadPoolExecutor & 总结》
- 《Java & Executor & ScheduledThreadPoolExecutor & 问题》
涉及内容
- 《Java & Executor & 总结》
- 《Java & Executor & ExecutorService & 源码》
- 《Java & Executor & ScheduledExecutorService & 总结》
- 《Java & Executor & ThreadPoolExecutor & 总结》
- 《Java & Executor & Future & 总结》
- 《Java & Executor & FutureTask & 总结》
- 《Java & Executor & ScheduledFutureTask & 总结》
- 《Java & Collection/Executor & BlockingQueue & 总结》
- 《Java & Collection/Executor & DelayedWorkQueue & 总结》
- 《Java & Executor & Callable & 总结》
- 《Java & Thread & Runnable & 总结》
概述
简介
ScheduledThreadPoolExecutor @ 调度线程池执行器类具备并发调度(延迟/周期)执行任务的能力。调度线程池执行器类是ThreadPoolExecutor @ 线程池执行器类/ScheduledExecutorService @ 调度执行器服务接口的子/实现类,在继承了多线程并发执行任务能力的同时还通过定制/组合延迟队列及封装任务的方式实现了令任务调度执行的效果。
使用
创建
-
public ScheduledThreadPoolExecutor(int corePoolSize) —— 创建指定核心池大小,且最大池大小为Integer.MAX_VALUE/持续存活时间为0/时间单位为纳秒/工作队列为延迟工作队列/线程工厂为默认线程工厂/拒绝执行处理器为中断策略的调度线程池执行器。
-
public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) —— 创建指定核心池大小/线程工厂,且最大池大小为Integer.MAX_VALUE/持续存活时间为0/时间单位为纳秒/工作队列为延迟工作队列/拒绝执行处理器为中断策略的调度线程池执行器。
-
public ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) —— 创建指定核心池大小/拒绝执行处理器,且最大池大小为Integer.MAX_VALUE/持续存活时间为0/时间单位为纳秒/工作队列为延迟工作队列/线程工厂为默认线程工厂的调度线程池执行器。
-
public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) —— 创建指定核心池大小/线程工厂/拒绝执行处理器,且最大池大小为Integer.MAX_VALUE/持续存活时间为0/时间单位为纳秒/工作队列为延迟工作队列的调度线程池执行器。
调度/执行/递交
-
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) —— 调度 —— 向当前调度线程池执行器递交可在指定延迟后执行的指定可运行任务,并返回可追踪/干预/获取指定可运行任务执行状态/过程/结果的调度未来。该方法无需在递交指定可运行任务时同步传入承载变量以作为向调度未来传递执行结果的媒介,因此调度未来无法用于获取指定可运行任务的执行结果,即调度未来的get(…)方法将永远返回null。
-
public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) —— 调度 —— 向当前调度线程池执行器递交可在指定延迟后执行的指定可调用任务,并返回可追踪/干预/获取指定可调用任务执行状态/过程/结果的调度未来。
-
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) —— 按固定速率调度 —— 向当前调度线程池执行器递交可在指定初始延迟后按指定周期周期性执行的指定可运行任务,并返回可追踪/干预/获取指定可运行任务执行状态/过程/结果的调度未来。该方法无需在递交指定可运行任务时同步传入承载变量以作为向调度未来传递执行结果的媒介,因此调度未来无法用于获取指定可运行任务的执行结果,即调度未来的get(…)方法将永远返回null。但又因为指定可运行任务会在未取消/无异常的情况下无限周期性执行而不记录结果,因此调度未来的get(…)方法要么因为取消/异常/超时而抛出取消/执行/超时异常,要么因为无法获取结果而无限等待。此外如果指定可运行任务的执行时间超过周期,那么下次执行会延迟至当前执行结束时启动,因此不会出现并发执行的情况。
-
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) —— 随固定延迟调度 —— 向当前调度线程池执行器递交可在指定初始延迟后按指定延迟周期性执行的指定可运行任务,并返回可追踪/干预/获取指定可运行任务执行状态/过程/结果的调度未来。该方法无需在递交指定可运行任务时同步传入承载变量以作为向调度未来传递执行结果的媒介,因此调度未来无法用于获取指定可运行任务的执行结果,即调度未来的get(…)方法将永远返回null。但又因为指定可运行任务会在未取消/无异常的情况下无限周期性执行而不记录结果,因此调度未来的get(…)方法要么因为取消/异常/超时而抛出取消/执行/超时异常,要么因为无法获取结果而无限等待。
-
public void execute(Runnable command) —— 执行 —— 向当前调度线程池执行器递交可立即执行的指定可运行任务。该方法等价于无/负延迟调用schedule(Runnable command, long delay, TimeUnit unit)方法。
-
public Future submit(Callable task) —— 递交 —— 向当前调度线程池执行器递交可立即执行的指定可调用任务,并返回可追踪/干预/获取指定可调用任务执行状态/过程/结果的未来。该方法等价于无/负延迟调用schedule(Callable callable, long delay, TimeUnit unit)方法。
-
public Future<?> submit(Runnable task) —— 递交 —— 向当前调度线程池执行器递交可立即执行的指定可运行任务,并返回可追踪/干预/获取指定可运行任务执行状态/过程/结果的未来。该方法无需在递交指定可运行任务时同步传入承载变量以作为向未来传递执行结果的媒介,因此未来无法用于获取指定可运行任务的执行结果,即未来的get(…)方法将永远返回null。该方法等价于无/负延迟调用schedule(Runnable command, long delay, TimeUnit unit)方法。
-
public Future submit(Runnable task, T result) —— 递交 —— 向当前调度线程池执行器递交可立即执行的指定可运行任务,并返回可追踪/干预/获取指定可运行任务执行状态/过程/结果的未来。该方法需在递交指定可运行任务时同步传入承载变量以作为向未来传递执行结果的媒介,因此承载变量/未来皆可用于获取指定可运行任务的执行结果。该方法等价于无/负延迟调用schedule(Callable callable, long delay, TimeUnit unit)方法。
-
public List<Future> invokeAll(Collection<? extends Callable> tasks) throws InterruptedException —— 调用所有 —— 向当前调度线程池执行器递交可立即执行的指定可调用任务集,并返回可追踪/干预/获取指定可调用任务执行状态/过程/结果的未来集。该方法会无限等待至指定可调用任务集全部执行结束,因此未来集中每个未来的isDone()方法调用结果都为true。当前线程在进入方法/等待执行期间如果已/被中断会抛出中断异常,但中断状态会被清除。
-
public List<Future> invokeAll(Collection<? extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException —— 调用所有 —— 向当前调度线程池执行器递交可立即执行的指定可调用任务集,并返回可追踪/干预/获取指定可调用任务执行状态/过程/结果的未来集。该方法会有限等待至指定可调用任务集全部执行结束,超出指定等待时间则取消剩余未结束的可调用任务,因此未来集中每个未来的isDone()方法调用结果都为true。当前线程在进入方法/等待执行期间如果已/被中断会抛出中断异常,但中断状态会被清除。
-
public T invokeAny(Collection<? extends Callable> tasks) throws InterruptedException, ExecutionException —— 调用任意 —— 向当前调度线程池执行器递交指定可调用任务集,并返回其中一个已执行完成的可调用任务执行结果。该方法会无限等待至指定可调用任务集中的一个执行完成,并取消剩余未结束的可调用任务。而如果所有可调用任务都执行失败(异常/取消)则会抛出执行异常。当前线程在进入方法/等待执行期间如果已/被中断会抛出中断异常,但中断状态会被清除。
-
public T invokeAny(Collection<? extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException —— 调用任意 —— 向当前调度线程池执行器递交指定可调用任务集,并返回其中一个已执行完成的可调用任务执行结果。该方法会有限等待至指定可调用任务集中的一个执行完成,并取消剩余未结束的可调用任务。超出指定等待时间则取消剩余未结束的可调用任务并抛出超时异常。而如果未超时但所有可调用任务都执行失败则会抛出执行异常。当前线程在进入方法/等待执行期间如果已/被中断会抛出中断异常,但中断状态会被清除。
invokeAll(…)/invokeAny(…)方法应在调度线程池执行器中不存在(大量)等待中任务时执行。由于invokeAll(…)/invokeAny(…)方法会等待至指定可调用任务集中的全部/一个执行结束,因此调度线程池执行器中存在大量等待中任务将可能导致invokeAll(…)/invokeAny(…)方法陷入长时间的等待。此外由于与早期任务并发执行还可能影响invokeAll(…)/invokeAny(…)方法的执行效率,因此在具体执行invokeAll(…)/invokeAny(…)方法前应该进行等待中任务的数量判断。
设置
-
public void setCorePoolSize(int corePoolSize) —— 设置核心池大小 —— 设置当前调度线程池执行器的核心池大小。
-
public void allowCoreThreadTimeOut(boolean value) —— 允许核心线程超时 —— 设置当前调度线程池执行器的核心执行线程是否允许超时回收。
-
public boolean allowsCoreThreadTimeOut() —— 允许核心线程超时 —— 判断当前调度线程池执行器是否允许核心执行线程超时回收。
-
public void setMaximumPoolSize(int maximumPoolSize) —— 设置最大池大小 —— 设置当前调度线程池执行器的最大池大小。
-
public void setKeepAliveTime(long time, TimeUnit unit) —— 设置持续存活时间 —— 设置当前调度线程池执行器的持续存活时间。
-
public void setThreadFactory(ThreadFactory threadFactory) —— 设置线程工厂 —— 设置当前调度线程池执行器的线程工厂。
-
public void setRejectedExecutionHandler(RejectedExecutionHandler handler) —— 设置拒绝执行处理器 —— 设置当前调度线程池执行器的拒绝执行处理器。
-
public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value) —— 设置关闭后继续存在周期任务集策略 —— 设置当前调度线程池执行器被关闭后是否允许继续执行旧周期任务。
-
public void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value) —— 设置关闭后继续存在延迟任务集策略 —— 设置当前调度线程池执行器被关闭后是否允许继续执行旧延迟任务。