总结:java
scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,若是上一个任务执行完毕,则当前任务当即执行,若是上一个任务没有执行完毕,则须要等上一个任务执行完毕后当即执行。ide
scheduleWithFixedDelay,是以上一个任务结束时开始计时,period时间过去后,当即执行。spa
重点:code
两个方法以不一样的时间点做为参考。blog
例子:it
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); } }
注意:io
经过ScheduledExecutorService执行的周期任务,若是任务执行过程当中抛出了异常,那么过ScheduledExecutorService就会中止执行任务,且也不会再周期地执行该任务了。因此你若是想保住任务都一直被周期执行,那么catch一切可能的异常。event