目的:
区别scheduleAtFixedRate
和scheduleWithFixedDelay
的用法。
api:
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。如果任务的任何一个执行遇到异常,则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。
注意: 如果执行这个命令花费时间比间隔时间period
长,那么下一个任务会在该任务执行完之后立即执行。
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。如果任务的任一执行遇到异常,就会取消后续执行。否则,只能通过执行程序的取消或终止方法来终止该任务。
注意: 执行完本任务之后,等待延迟时间之后,在执行下一次任务。
实例:
package com.novel.collect;
import java.util.Date;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
public class CollectScheduledThread {
private static Logger log = Logger.getLogger(CollectScheduledThread.class);
private static ScheduledThreadPoolExecutor threadPool;
static{
threadPool = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors());
}
public static void main(String[] args) {
threadPool.scheduleAtFixedRate(new CollectRunnable("任务1"), 0, 1, TimeUnit.MINUTES);
threadPool.scheduleWithFixedDelay(new CollectRunnable("任务2"), 0, 1, TimeUnit.MINUTES);
}
}
class CollectRunnable implements Runnable{
private String name = "";
public CollectRunnable(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("任务【" + name + "】执行。" + new Date());
try {
Thread.sleep((long) (1000*60*1.5));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
任务【任务2】执行。Tue Aug 23 09:57:38 CST 2016
任务【任务1】执行。Tue Aug 23 09:57:38 CST 2016
任务【任务1】执行。Tue Aug 23 09:59:08 CST 2016
任务【任务2】执行。Tue Aug 23 10:00:08 CST 2016
任务【任务1】执行。Tue Aug 23 10:00:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:02:08 CST 2016
任务【任务2】执行。Tue Aug 23 10:02:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:03:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:05:08 CST 2016
任务【任务2】执行。Tue Aug 23 10:05:08 CST 2016
任务【任务1】执行。Tue Aug 23 10:06:38 CST 2016
任务【任务2】执行。Tue Aug 23 10:07:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:08:08 CST 2016
任务【任务1】执行。Tue Aug 23 10:09:38 CST 2016
任务【任务2】执行。Tue Aug 23 10:10:08 CST 2016
任务【任务1】执行。Tue Aug 23 10:11:08 CST 2016
任务【任务1】执行。Tue Aug 23 10:12:38 CST 2016
任务【任务2】执行。Tue Aug 23 10:12:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:14:08 CST 2016
任务【任务2】执行。Tue Aug 23 10:15:08 CST 2016
任务【任务1】执行。Tue Aug 23 10:15:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:17:08 CST 2016
任务【任务2】执行。Tue Aug 23 10:17:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:18:38 CST 2016
任务【任务1】执行。Tue Aug 23 10:20:08 CST 2016
*/