ScheduledExecutorService详解
ScheduledExecutorService
是 Java 并发工具包 (java.util.concurrent
) 中的一个接口,用于在指定的延迟后执行任务,或者以固定的时间间隔周期性执行任务。它是 ExecutorService
的子接口,提供了更强大的调度功能。
ScheduledExecutorService
提供了以下主要方法:
1.核心方法:scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
-
方法解释:是以上一个任务开始的时间计时,比如period为5,那5秒后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行,如果你的任务执行时间超过5秒,那么任务时间间隔参数将无效,任务会不停地循环执行,由此可得出该方法不能严格保证任务按一定时间间隔执行
-
参数:
参数名称
作用
command
要执行的任务(
Runnable
)initialDelay
初始延迟时间
delay
任务执行间隔
unit
时间单位。
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 初始延迟 1 秒,之后每 2 秒执行一次任务
scheduler.scheduleAtFixedRate(() -> {
System.out.println("固定速率任务执行时间: " + System.currentTimeMillis());
}, 1, 2, TimeUnit.SECONDS);
// 让主线程等待一段时间,观察任务执行
try {
Thread.sleep(10000); // 等待 10 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭调度器
scheduler.shutdown();
}
2.
核心方法:scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
-
以上一次任务执行结束时间为准,加上任务时间间隔作为下一次任务开始时间,由此可以得出,任务可以严格按照时间间隔执行
-
参数:
参数名称
作用
command
要执行的任务(
Runnable
)initialDelay
初始延迟时间
delay
任务执行间隔
unit
时间单位。
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 初始延迟 1 秒,之后每次任务结束后延迟 2 秒再执行下一次任务
scheduler.scheduleWithFixedDelay(() -> {
System.out.println("固定延迟任务执行时间: " + System.currentTimeMillis());
try {
Thread.sleep(1000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}, 1, 2, TimeUnit.SECONDS);
// 让主线程等待一段时间,观察任务执行
try {
Thread.sleep(10000); // 等待 10 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭调度器
scheduler.shutdown();
}
3.
核心方法:schedule(Runnable command, long delay, TimeUnit unit)
-
在指定的延迟后执行一次任务。
-
参数:
参数名称 | 作用 |
| 要执行的任务( |
delay | 延迟时间 |
| 时间单位。 |
public static void main(String[] args) {
// 创建一个调度线程池
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 延迟 3 秒后执行任务
scheduler.schedule(() -> {
System.out.println("任务执行时间: " + System.currentTimeMillis());
}, 3, TimeUnit.SECONDS);
// 关闭调度器
scheduler.shutdown();