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 上傳完成


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