En annan typ av aktivitetspool är den schemalagda aktivitetspoolen. Av namnet att döma kan vi anta att vi använder den här typen för att schemalägga när en viss uppgift ska lanseras.

Den här typen av tjänst är användbar när vi har en uppgift att starta en aktivitet efter att en tid har förflutit eller vi vill schemalägga en återkommande uppgift.

För att använda en anropar vi Executors.newScheduledThreadPool(1) .

Vi kommer att prata om parametrarna lite senare. Men för nu, vad vi behöver veta är att när den här metoden anropas får vi ett ScheduledExecutorService -objekt.

ScheduledExecutorService är ett gränssnitt som utökar ExecutorService .

Följande metoder visas i det här gränssnittet:

Metod Förklaring

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Skapar och utför en engångsåtgärd som körs efter den angivna fördröjningen.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Skapar och utför enScheduledFutureobjekt som körs efter en viss fördröjning.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Skapar och utför en återkommande åtgärd som körs först efter den angivna initiala fördröjningen och sedan igen efter den angivna perioden. Med andra ord kommer exekveringen att starta efter initialDelay , sedan initialDelay + period , sedan initialDelay + 2 * period , och så vidare.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Skapar och utför en återkommande åtgärd som körs först efter den angivna initiala fördröjningen och sedan igen med den angivna fördröjningen mellan slutförandet av en exekvering och början av nästa.

Så gränssnittet låter oss köra uppgifter med jämna mellanrum eller efter viss fördröjning.

Mer om den nya ScheduledThreadPool-metoden.

Vi kan kalla det på flera sätt:


newScheduledThreadPool(int corePoolSize)
corePoolSize är antalet trådar som ska hållas i poolen, även om de är inaktiva.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize är antalet trådar som ska hållas i poolen, även om de är inaktiva.

threadFactory är fabriken att använda när du skapar nya trådar.

Båda metoderna kommer att skapa en trådpool som kan schemalägga åtgärder för att utföras efter en viss fördröjning eller periodiskt.

Låt oss titta på ett exempel för att se hur ScheduledThreadPool fungerar.

Anta till exempel att vi har en uppgift att kontrollera e-post var 5:e sekund, men denna kontroll får inte påverka huvudprogrammet och medför potentiell förbrukning av ytterligare resurser.

Vi har en uppgiftsklass som simulerar att kolla e-post.


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

Därefter skapar vi en trådpool och schemalägger kontrollen.


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

I utgången ser vi var 5:e sekund:

Kontrollerar e-post...

I allmänhet kan vi använda en sådan pool för att utföra periodiska "hushållsuppgifter", som i exemplet. Hushållsuppgifter är uppgifter som ska utföras oavsett vad huvudprogrammet gör.