前幾篇文章中分別介紹了
單線程化線程池(newSingleThreadExecutor)
可控最大並發數線程池(newFixedThreadPool)
可回收緩存線程池(newCachedThreadPool)
newScheduledThreadPool用於構造安排線程池,能夠根據需要安排在給定延遲后運行命令或者定期地執行。
在JAVA文檔的介紹
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
創建一個線程池,它可安排在給定延遲后運行命令或者定期地執行。
參數:corePoolSize - 池中所保存的線程數,即使線程是空閑的也包括在內。
返回:新創建的安排線程池
需要注意的是,參數corePoolSize在這個方法中是沒用意義的,詳解見JAVA進階----ThreadPoolExecutor機制。
具體實現:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolByNewScheduledThreadPool {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : 延遲3秒");
}
});
/**
* 定長線程池,支持定時及周期性任務執行
*/
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
//延遲3s后運行
scheduledThreadPool.schedule(thread, 3, TimeUnit.SECONDS);
//首次執行延遲1s,每次間隔3秒
//scheduledThreadPool.scheduleAtFixedRate(thread, 1, 3, TimeUnit.SECONDS);
//每次執行結束,已固定時延開啟下次執行
//scheduledThreadPool.scheduleWithFixedDelay(thread, 1, 3, TimeUnit.SECONDS);
System.out.println(Thread.currentThread().getName() + " : main thread");
scheduledThreadPool.shutdown();
// try {
// Thread.sleep(12000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// scheduledThreadPool.shutdownNow();
}
}
后面注釋掉的內容表示強制程序最大執行實際為12s,這通常是不切實際的,常常會需要在線程中設置標志位或標記系統時間來獲取程序的終止時間。這就涉及到獲取線程返回值的問題。將在后續文章中進行介紹。