Java Schedule 排程

使用 Timer

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

	public static void main(String[] args) {
		Timer timer = new Timer(); 
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("do");
			}
		}, new Date(), 1 * 1000);
	}
}

使用 ScheduledExecutorService

要跑的程式

public class ScheduleTest implements Runnable {

	@Override
	public void run() {
		System.out.println("do");
	}
}

排程

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test {

	public static void main(String[] args) {
		ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
		service.scheduleWithFixedDelay(new ScheduleTest(), 0, 1, TimeUnit.SECONDS);
	}
}

有幾種方法

service.schedule(command, delay, unit);
service.schedule(callable, delay, unit);
service.scheduleAtFixedRate(command, initialDelay, period, unit);
service.scheduleWithFixedDelay(command, initialDelay, delay, unit);

unit 指時間單位 java.util.concurrent.TimeUnit.*

DAYS
HOURS
MINUTES
SECONDS
MILLISECONDS // 0.001 second
MICROSECONDS
 // 0.000001 second
NANOSECONDS
 // 0.000000001 second

scheduleAtFixedRate 與 scheduleWithFixedDelay 的差別

Rate 是頻率,即多久做一次,由起始時間起算
Delay 是間隔,即隔多久做一次,由上次結束時間起算

例如:每一小時上傳一次,每次耗時五分鐘
使用 scheduleAtFixedRate 會是
01:00 上傳
02:00 上傳
03:00 上傳


使用 scheduleWithFixedDelay 會是
01:00 上傳
01:05 上傳完成
02:05 上傳
02:10 上傳完成
03:10 上傳
03:15 上傳完成


由此可見一個是根據開始時間,一個是結束時間,差距就是每次的執行時間
當執行時間長或頻率累積多了,就會產生顯著的差異