使用 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 上傳完成
…
由此可見一個是根據開始時間,一個是結束時間,差距就是每次的執行時間
當執行時間長或頻率累積多了,就會產生顯著的差異