踩坑系列之scheduleWithFixedDelay 和 scheduleAtFixedRate |
您所在的位置:网站首页 › at调度如何退出 › 踩坑系列之scheduleWithFixedDelay 和 scheduleAtFixedRate |
定时任务和延时任务的理解
ScheduledExecutorService#scheduleAtFixedRate() 指的是“以固定的频率”执行,period(周期)指的是两次成功执行之间的时间。上一个任务开始的时间计时,一个period后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。
ScheduledExecutorService#scheduleWithFixedDelay() 指的是“以固定的延时”执行,delay(延时)指的是一次执行终止和下一次执行开始之间的延迟。
示例
scheduleAtFixedRate
public static void main(String[] args) {
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(
"my-test-pool-%d").build();
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, threadFactory);
Date startTime = new Date();
System.out.println("startTime: " + startTime.toString());
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println("beginTime: " + new Date().toString());
try {
Thread.sleep(5 * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("endTime: " + new Date().toString());
}, 2, 3, TimeUnit.SECONDS);
}
输出: startTime: Sun Feb 16 11:17:09 CST 2020 beginTime: Sun Feb 16 11:17:11 CST 2020 endTime: Sun Feb 16 11:17:16 CST 2020 beginTime: Sun Feb 16 11:17:16 CST 2020 endTime: Sun Feb 16 11:17:21 CST 2020 beginTime: Sun Feb 16 11:17:21 CST 2020 endTime: Sun Feb 16 11:17:26 CST 2020 beginTime: Sun Feb 16 11:17:26 CST 2020 endTime: Sun Feb 16 11:17:31 CST 2020 beginTime: Sun Feb 16 11:17:31 CST 2020 endTime: Sun Feb 16 11:17:36 CST 2020 beginTime: Sun Feb 16 11:17:36 CST 2020当前任务执行时间大于等于间隔时间,任务执行后立即执行下一次任务。相当于连续执行了。 scheduleWithFixedDelay public static void main(String[] args) { ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat( "my-test-pool-%d").build(); ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, threadFactory); Date startTime = new Date(); System.out.println("startTime: " + startTime.toString()); scheduledExecutorService.scheduleWithFixedDelay(() -> { System.out.println("beginTime: " + new Date().toString()); try { Thread.sleep(5 * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("endTime: " + new Date().toString()); }, 2, 3, TimeUnit.SECONDS); }输出: startTime: Sun Feb 16 11:27:26 CST 2020 beginTime: Sun Feb 16 11:27:28 CST 2020 endTime: Sun Feb 16 11:27:33 CST 2020 beginTime: Sun Feb 16 11:27:36 CST 2020 endTime: Sun Feb 16 11:27:41 CST 2020 beginTime: Sun Feb 16 11:27:44 CST 2020 endTime: Sun Feb 16 11:27:49 CST 2020 beginTime: Sun Feb 16 11:27:52 CST 2020每当上次任务执行完毕后,间隔一段时间执行。不管当前任务执行时间大于、等于还是小于间隔时间,执行效果都是一样的。 常见的“坑”关于定时线程池(定时任务scheduleAtFixedRate和延时任务scheduleWithFixedDelay),好多人认为设置好频率(比如1Min),它会按照这个间隔按部就班的工作。但是,如果其中一次调度任务卡住的话,不仅这次调度失败,而且整个线程池也会停在这次调度上。 示例如果run方法中抛出异常,而又没有捕获,会导致整个定时任务卡住。建议在整个run方法中使用try...catch...fianlly...处理。 public static void main(String[] args) { ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat( "my-test-pool-%d").build(); ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1, threadFactory); Date startTime = new Date(); System.out.println("startTime: " + startTime.toString()); scheduledExecutorService.scheduleAtFixedRate(() -> { System.out.println("beginTime: " + new Date().toString()); try { Thread.sleep(5 * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("endTime: " + new Date().toString()); throw new NullPointerException(); }, 2, 3, TimeUnit.SECONDS); } |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |