另一種類型的任務池是計劃任務池。從名稱來看,我們可以假設我們使用此類型來安排何時應啟動特定任務。

當我們有一個任務要在一段時間後啟動一個活動,或者我們想要安排一個重複性任務時,這種類型的服務很有用。

要使用一個,我們調用Executors.newScheduledThreadPool(1)

稍後我們將討論參數。但現在,我們需要知道的是,當調用此方法時,我們將獲得一個ScheduledExecutorService對象。

ScheduledExecutorService是一個擴展ExecutorService的接口。

該界面中出現以下方法:

方法 解釋

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
創建並執行在指定延遲後運行的一次性操作。

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
創建並執行一個預定的未來在指定延遲後執行的對象。

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
創建並執行一個循環操作,該操作首先在指定的初始延遲後運行,然後在指定的時間段後再次運行。換句話說,執行將在initialDelay之後開始,然後是initialDelay + period,然後是initialDelay + 2 * period,依此類推。

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
創建並執行一個循環操作,該操作在指定的初始延遲後首先執行,然後在一次執行完成和下一次執行開始之間以指定的延遲再次執行。

因此,該界面讓我們可以定期或延遲一段時間後運行任務。

有關 newScheduledThreadPool 方法的更多信息。

我們可以通過多種方式調用它:


newScheduledThreadPool(int corePoolSize)
corePoolSize是保留在池中的線程數,即使它們是空閒的。

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize是保留在池中的線程數,即使它們是空閒的。

threadFactory是創建新線程時使用的工廠。

這兩種方法都將創建一個線程池,該線程池可以安排在指定延遲後或定期執行的操作。

讓我們看一個例子來了解ScheduledThreadPool是如何工作的。

例如,假設我們有一項任務是每 5 秒檢查一次電子郵件,但這種檢查不能影響主程序並且可能會消耗額外的資源。

我們有一個模擬檢查電子郵件的任務類。


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

接下來,我們創建一個線程池並安排檢查。


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

在輸出中,我們每 5 秒就會看到:

正在檢查電子郵件...

通常,我們可以使用這樣的池來執行週期性的“內務處理”任務,如示例中所示。管家任務是無論主程序在做什麼都必須執行的任務。