目的:
區別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
*/