ExecutorService,可安排在给定的延迟后运行或定期执行的命令。
schedule
方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。scheduleAtFixedRate
和 scheduleWithFixedDelay
方法创建并执行某些在取消前一直定期运行的任务。
用 Executor.execute(java.lang.Runnable) 和 ExecutorService 的 submit
方法所提交的命令,通过所请求的 0 延迟进行安排。schedule
方法中允许出现 0 和负数延迟(但不是周期),并将这些视为一种立即执行的请求。
所有的 schedule
方法都接受相对 延迟和周期作为参数,而不是绝对的时间或日期。将以 Date 所表示的绝对时间转换成要求的形式很容易。例如,要安排在某个以后的Date
运行,可以使用:schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)
。但是要注意,由于网络时间同步协议、时钟漂移或其他因素的存在,因此相对延迟的期满日期不必与启用任务的当前 Date
相符。 Executors 类为此包中所提供的 ScheduledExecutorService 实现提供了便捷的工厂方法。
1.ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
- 创建并执行在给定延迟后启用的一次性操作。
-
-
参数:
-
command
- 要执行的任务 -
delay
- 从现在开始延迟执行的时间 -
unit
- 延迟参数的时间单位
返回:
-
表示挂起任务完成的 ScheduledFuture,并且其
get()
方法在完成后将返回null
抛出:
-
RejectedExecutionException
- 如果无法安排执行该任务 -
NullPointerException
- 如果 command 为 null
-
2.<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
- 创建并执行在给定延迟后启用的 ScheduledFuture。
-
-
参数:
-
callable
- 要执行的功能 -
delay
- 从现在开始延迟执行的时间 -
unit
- 延迟参数的时间单位
返回:
- 可用于提取结果或取消的 ScheduledFuture 抛出:
-
RejectedExecutionException
- 如果无法安排执行该任务 -
NullPointerException
- 如果 callable 为 null
-
3.ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay, long period, TimeUnit unit)
-
创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在
initialDelay
后开始执行,然后在initialDelay+period
后执行,接着在initialDelay + 2 * period
后执行,依此类推。如果任务的任何一个执行遇到异常,则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。 -
-
参数:
-
command
- 要执行的任务 -
initialDelay
- 首次执行的延迟时间 -
period
- 连续执行之间的周期 -
unit
- initialDelay 和 period 参数的时间单位
返回:
-
表示挂起任务完成的 ScheduledFuture,并且其
get()
方法在取消后将抛出异常
抛出:
-
RejectedExecutionException
- 如果无法安排执行该任务 -
NullPointerException
- 如果 command 为 null -
IllegalArgumentException
- 如果 period 小于等于 0
-
4.ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay, long delay, TimeUnit unit)
- 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。如果任务的任一执行遇到异常,就会取消后续执行。否则,只能通过执行程序的取消或终止方法来终止该任务。
-
参数:
-
command
- 要执行的任务 -
initialDelay
- 首次执行的延迟时间 -
delay
- 一次执行终止和下一次执行开始之间的延迟 -
unit
- initialDelay 和 delay 参数的时间单位
返回:
-
表示挂起任务完成的 ScheduledFuture,并且其
get()
方法在取消后将抛出异常
抛出:
-
RejectedExecutionException
- 如果无法安排执行该任务 -
NullPointerException
- 如果 command 为 null。 -
IllegalArgumentException
- 如果 delay 小于等于 0 - 例子:
- private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
- public static void main(String[] args) {
- Timer time = new Timer();
- ScheduledTest test = new ScheduledTest();
- test.beepForAnHour();
- }
- public void beepForAnHour() {
- final Runnable beeper = new Runnable() {
- public void run() {
- System.out.println("beep");
- }
- };
- final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
- beeper, 0, 1, TimeUnit.SECONDS);
- scheduler.schedule(new Runnable() {
- public void run() {
- try {
- beeperHandle.cancel(true);
- beeperHandle.wait(1);
- System.out.println("==============");
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }, 6, TimeUnit.SECONDS);
- }