总结:
scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。
scheduleWithFixedDelay,是以上一个任务结束时开始计时,period时间过去后,立即执行。
重点:
两个方法以不同的时间点作为参考。
package com.yuankai.t1.thread; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduleExecutorServiceTest { public static void main(String[] args) { ScheduleExecutorServiceTest test = new ScheduleExecutorServiceTest(); test.testWithFixedDelay(); } private ScheduledExecutorService executor; public ScheduleExecutorServiceTest() { executor = Executors.newScheduledThreadPool(4); } public void testAtFixedRate() { executor.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("===="); try { Thread.sleep(10000); System.out.println("执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } } }, 1000, 3000, TimeUnit.MILLISECONDS); } public void testWithFixedDelay() { executor.scheduleWithFixedDelay(new Runnable() { public void run() { System.out.println("===="); try { int i = 1 / 0; } catch (Exception e) { e.printStackTrace(); } /* try { Thread.sleep(10000); System.out.println("执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } */ } }, 1000, 3000, TimeUnit.MILLISECONDS); } }
注意: 通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么过ScheduledExecutorService就会停止执行任务,且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行,那么catch一切可能的异常。