ScheduledExecutorService
是Java中用于调度任务的接口,它是ExecutorService
的子接口,扩展了线程池的功能,允许您在预定的时间执行任务,也可以周期性地重复执行任务。ScheduledExecutorService
可以用于在未来的某个时间点执行任务,也可以按固定的时间间隔重复执行任务。
ScheduledExecutorService
接口定义了两个主要的方法用于调度任务:
schedule(Runnable command, long delay, TimeUnit unit)
: 以延迟指定的时间后执行任务。scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
: 在指定的初始延迟后开始执行任务,然后按照固定的时间间隔重复执行任务。需要注意的是,scheduleAtFixedRate
方法不会考虑任务的执行时间,即使任务执行时间超过指定的时间间隔,仍然会按照固定的时间间隔重复执行。
除了这两个方法外,ScheduledExecutorService
还继承了ExecutorService
接口中的其他方法,如execute(Runnable command)
和shutdown()
等,因此可以像普通的线程池一样执行任务。
下面是一个简单的示例,展示了如何使用ScheduledExecutorService
:
import java.util.concurrent.*;
public class ScheduledExecutorServiceDemo {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
// 延迟5秒后执行任务
executor.schedule(new Runnable() {
@Override
public void run() {
System.out.println("任务1:延迟5秒后执行,执行时间:" + System.currentTimeMillis());
}
}, 5, TimeUnit.SECONDS);
// 延迟2秒后开始执行任务,然后每隔3秒重复执行
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("任务2:每隔3秒执行一次,执行时间:" + System.currentTimeMillis());
}
}, 2, 3, TimeUnit.SECONDS);
// 等待一段时间,然后关闭线程池
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
在这个示例中,我们创建了一个包含一个线程的ScheduledExecutorService
。我们使用schedule
方法安排一个任务在5秒后执行,使用scheduleAtFixedRate
方法安排另一个任务在2秒后开始执行,然后每隔3秒重复执行。
输出结果可能是这样的:
任务1:延迟5秒后执行,执行时间:1666112652069
任务2:每隔3秒执行一次,执行时间:1666112652071
任务2:每隔3秒执行一次,执行时间:1666112655073
任务2:每隔3秒执行一次,执行时间:1666112658074
任务2:每隔3秒执行一次,执行时间:1666112661075
任务2:每隔3秒执行一次,执行时间:1666112664077
任务2:每隔3秒执行一次,执行时间:1666112667078
从输出结果中可以看出,任务1在5秒后执行,任务2在2秒后开始执行,然后每隔3秒重复执行。
通过ScheduledExecutorService
,您可以轻松地安排任务在未来的某个时间点执行,或者按照固定的时间间隔重复执行,从而满足不同的调度需求。