今天要介紹 newScheduledThreadPool 和 newSingleThreadScheduledExecutor 這二個屬於於執行緒排程,定期會執行執行緒。
sample code 如下:
1.newScheduledThreadPool
import java.util.Date;
public class ThreadExample implements Runnable {
private long lastTime;
public ThreadExample(long lastTime) {
this.lastTime = lastTime;
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println("run " + threadName + " thread, " + (new Date().getTime() - lastTime));
}
}
以上的程式是執行緒的程式,主要會把目前使用到的執行緒名稱以及目前的時間減掉從主程式開始執行的時間印出來,用來確認執行緒隔多久的時間執行。
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 scheduledThreadPool = Executors.newScheduledThreadPool(5);
long lastTime = System.currentTimeMillis();
scheduledThreadPool.scheduleAtFixedRate(new ThreadExample(lastTime), 1, 5, TimeUnit.SECONDS);
}
}
以上是主程式,使用了 newScheduledThreadPool 建立了 scheduled 的執行緒 pool,然後指定的型態不是 ExecutorService 而是 ScheduledExecutorService 這樣才能執行排程的方法。之後就會呼叫 scheduleAtFixedRate 的方法。程式在開始後等待了 1 秒之後執行緒開始的去執行,每隔 5 秒去執行一次 ThreadExample 的執行緒,執行的結果如下:
run pool-1-thread-1 thread, 1004
run pool-1-thread-1 thread, 6001
run pool-1-thread-2 thread, 11002
run pool-1-thread-1 thread, 16001
run pool-1-thread-3 thread, 21002
run pool-1-thread-3 thread, 26001
run pool-1-thread-3 thread, 31002
以上的執行結果就是每隔固定 5 秒的時間印出字串
在啟動執行緒時,除了可以呼叫 scheduleAtFixedRate 的方法,另外還可以呼叫 scheduleWithFixedDelay 方法。它們之間的差別是 scheduleAtFixedRate 是固定的每隔 5 秒印出字串,然後 scheduleWithFixedDelay 方法是一定要等待上個執行緒執行完成之後才會往下繼續執行。
import java.util.Date;
public class ThreadExample implements Runnable {
private long lastTime;
public ThreadExample(long lastTime) {
this.lastTime = lastTime;
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println("run " + threadName + " thread, " + (new Date().getTime() - lastTime));
}
}
以上執行緒的程式會印出目前使用了哪個執行緒的名稱在執行以及這個執行緒在第幾毫秒時被執行的資訊
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 scheduledThreadPool = Executors.newSingleThreadScheduledExecutor();
long lastTime = System.currentTimeMillis();
scheduledThreadPool.scheduleAtFixedRate(new ThreadExample(lastTime), 1, 5, TimeUnit.SECONDS);
}
}
主程式的部份在 Executors 呼叫了 newSingleThreadScheduledExecutor 方法,只會有單一執行緒在執行,執行的結果如下:
run pool-1-thread-1 thread, 1006
run pool-1-thread-1 thread, 6004
run pool-1-thread-1 thread, 11004
run pool-1-thread-1 thread, 16004
run pool-1-thread-1 thread, 21004
run pool-1-thread-1 thread, 26004
從以上的執行結果可以看出,每一次都使用一個執行緒在執行程式。