前言
相关系列
- 《Java & Executor & 目录》
- 《Java & Executor & ScheduledExecutorService & 源码》
- 《Java & Executor & ScheduledExecutorService & 总结》
- 《Java & Executor & ScheduledExecutorService & 问题》
涉及内容
概述
简介
ScheduledExecutorService @ 调度执行器服务接口定义了“调度”概念。调度执行器服务接口是在ExecutorService @ 执行器服务接口的子接口,其在原本的基础上再度新增了“调度”概念。所谓调度可以理解为定时执行,即令任务在指定时间点被执行,而非在可执行时立即执行。
调度执行器服务接口将“调度”概念细分为“延迟/周期”。“延迟”概念顾名思义,即任务会在其可执行的时间点上延迟指定时间后执行。这种延迟是人为规定的,与任务的执行机制无关。而大部分执行器由于自身任务执行机制的原因虽然也可能造成延迟,但这种延迟并非人为规定,因此与“延迟”概念没有关系。由此可知虽然调度执行器服务接口支持指定任务的延迟时间,但在任务具体执行时其实际延迟时间可能比指定延迟时间更长/短。此外调度执行器服务接口支持零/负延迟,当延迟时间被指定为零/负值时任务会被立即执行。关于“周期”的概念很也好理解,即令任务周期性地重复执行。通过对这两种概念进行组合,调度执行器服务接口可实现无延迟单次执行/有延迟单次执行/无延迟周期执行/有延迟周期执行四种任务调度形式。
方法
-
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(…)方法要么因为取消/异常/超时而抛出取消/执行/超时异常,要么因为无法获取结果而无限等待。