scheduleAtFixedRate:是以period为间隔来执行任务的,如果任务执行时间小于period,则上次任务执行完成后会间隔period后再去执行下一次任务;但如果任务执行时间大于period,则上次任务执行完毕后会不间隔的立即开始下次任务
而scheduleWithFixedDelay 是不管任务执行多久,都会等上一次任务执行完毕后再延迟delay后去执行下次任务
不多bb,直接上来代码来瞅瞅。。。
1、 scheduleAtFixedRate,任务执行时间小于period时
public static void circleScheduleTask() {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(new Runnable() {
private int count = 0;
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void run() {
String time = simpleDateFormat.format(new Date());
System.out.println(time + " >>第"+ (++count) + "次执行定时任务.");
}
}, 0, 2000, TimeUnit.MILLISECONDS);
}
结果:可以看到上次任务完成后,间隔2s执行下次任务
00:16:45 >>第1次执行定时任务.
00:16:47 >>第2次执行定时任务.
00:16:49 >>第3次执行定时任务.
00:16:51 >>第4次执行定时任务.
00:16:53 >>第5次执行定时任务.
2、scheduleAtFixedRate,任务执行时间大于period时
public static void circleScheduleTask() {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(new Runnable() {
private int count = 0;
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void run() {
String time = simpleDateFormat.format(new Date());
System.out.println(time + " >>第"+ (++count) + "次执行定时任务.");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 0, 2000, TimeUnit.MILLISECONDS);
}
结果:可以看到,上次任务执行了3s结束后,立马执行下次任务
00:21:18 >>第1次执行定时任务.
00:21:21 >>第2次执行定时任务.
00:21:24 >>第3次执行定时任务.
00:21:27 >>第4次执行定时任务.
3、scheduleWithFixedDelay,任务执行时间大于delay
public static void circleScheduleTask() {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleWithFixedDelay(new Runnable() {
private int count = 0;
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String time = simpleDateFormat.format(new Date());
System.out.println(time + " >>第"+ (++count) + "次执行定时任务.");
}
}, 0, 2000, TimeUnit.MILLISECONDS);
}
结果:可以看到,上次任务执行3s完成后,延迟了2 s后才执行的下次任务
这个和2就有了明显的区别了
00:24:28 >>第1次执行定时任务.
00:24:33 >>第2次执行定时任务.
00:24:38 >>第3次执行定时任务.
00:24:43 >>第4次执行定时任务.