一、概述
- SheduleExecutorService 是JDK 1.5出来的;
- SheduleExecutorService 是基于线程池设计的定时任务类,每个调度任务都是会在线程池中分配到一个线程去执行,任务是并行的;
- 只有当调度任务运行时,ScheduledExecutorService 才会真正启动一个线程,其余时间ScheduledExecutorService都是处于轮询任务的状态;
- 其方法 schedule 是以相对延迟和周期作为参数。
注意:通过 ScheduledExecutorService 执行的周期任务,如果任务执行过程中抛出了异常,那么 ScheduledExecutorService 就会停止执行任务,且不会周期地执行该任务了。所以想该任务一直被周期执行,那么需要 catch 一切可能的异常。
二、方法
前两方法:是给定延迟后启用的一次性操作。后两方法:是周期性执行操作。
1.以固定频率周期执行任务
ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
command
- 要执行的任务initialDelay
- 首次执行的延迟时间period
- 连续执行之间的周期unit
- initialDelay 和 period 参数的时间单位
2.以固定延迟周期执行任务
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
command
- 要执行的任务initialDelay
- 首次执行的延迟时间delay
- 一次执行终止和下一次执行开始之间的延迟unit
- initialDelay 和 delay 参数的时间单位
3.Demo
调度线程任务
public class ScheduledExecutorServiceTest implements Runnable {
ScheduledExecutorServiceTest() {
}
@Override
public void run() {
... //需要执行的任务
System.out.println("The current time is " +new Date() + ".");
}
}
3.1 scheduleAtFixedRate
public static void main(String[] args) {
ScheduledExecutorService seService = Executors.newScheduledThreadPool(2);
// 从现在开始1分钟之后,每隔5分钟执行一次
service.scheduleAtFixedRate(new ScheduledExecutorServiceTest(), 1, 5, TimeUnit.SECONDS);
}
3.2 scheduleWithFixedDelay
public static void main(String[] args) {
ScheduledExecutorService seService = Executors.newScheduledThreadPool(2);
// 从现在开始1分钟之后,每此执行完后隔5分钟再执行一次
service.scheduleWithFixedDelay(new ScheduledExecutorServiceTest(), 1, 5, TimeUnit.SECONDS);
}