为了持续的多次执行常见的任务,我们可以利用调度线程池。ScheduledExecutorService支持任务调度,持续执行或者延迟一段时间后执行。调度一个任务将会产生一个专门的future类型ScheduleFuture,它除了提供了Future的所有方法外,还提供了getDelay方法来获得剩余的延迟。在延迟结束后,任务将会并发执行。
为了调度任务持续的执行,executors提供了两个方法scheduleAtFixedRate和scheduleWithFixedDelay。第一个方法用来以固定频率执行一个任务,这个方法接收一个初始化延迟,用来指定这个任务首次被执行等待的时长。第二个方法用来延迟任务的执行。
package com.test.sche;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduleTest {
public static void main(String[] args) {
// 创建一个任务调度的连接池服务
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
Runnable command = new Runnable() {
@Override
public void run() {
System.out.println(System.currentTimeMillis()+"-->start done");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(System.currentTimeMillis()+"end done");
}
};
// 1. 延时任务 延时指定之间之后执行任务
// service.schedule(command, 5, TimeUnit.SECONDS);
// 2. 周期任务 在固定的频率 执行周期任务
// service.scheduleAtFixedRate(command, 0, 5, TimeUnit.SECONDS);
// 3. 周期任务 在固定的延时 执行周期任务 上一次任务结束之后 延时指定之间开始下一个任务
service.scheduleWithFixedDelay(command, 0, 5, TimeUnit.SECONDS);
}
}