En anden type opgavepulje er den planlagte opgavepulje. At dømme efter navnet kan vi antage, at vi bruger denne type til at planlægge, hvornår en bestemt opgave skal lanceres.

Denne type service er nyttig, når vi har en opgave, der skal starte en aktivitet, efter der er gået noget tid, eller vi ønsker at planlægge en tilbagevendende opgave.

For at bruge en kalder vi Executors.newScheduledThreadPool(1) .

Vi vil tale om parametrene lidt senere. Men for nu er det, vi skal vide, at når denne metode kaldes, får vi et ScheduledExecutorService -objekt.

ScheduledExecutorService er en grænseflade, der udvider ExecutorService .

Følgende metoder vises i denne grænseflade:

Metode Forklaring

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Opretter og udfører en engangshandling, der kører efter den angivne forsinkelse.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Opretter og udfører enScheduledFutureobjekt, der udføres efter en specificeret forsinkelse.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Opretter og udfører en tilbagevendende handling, der kører først efter den angivne indledende forsinkelse og derefter igen efter den angivne periode. Med andre ord vil eksekveringen starte efter initialDelay , derefter initialDelay + periode , derefter initialDelay + 2 * periode , og så videre.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Opretter og udfører en tilbagevendende handling, der udføres først efter den angivne indledende forsinkelse, og derefter igen med den angivne forsinkelse mellem afslutningen af ​​en udførelse og starten af ​​den næste.

Så grænsefladen lader os køre opgaver med jævne mellemrum eller efter en vis forsinkelse.

Mere om den nye ScheduledThreadPool-metoden.

Vi kan kalde det på flere måder:


newScheduledThreadPool(int corePoolSize)
corePoolSize er antallet af tråde, der skal opbevares i poolen, selvom de er inaktive.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize er antallet af tråde, der skal opbevares i poolen, selvom de er inaktive.

threadFactory er fabrikken, der skal bruges ved oprettelse af nye tråde.

Begge metoder vil oprette en trådpulje, der kan planlægge handlinger til at udføre efter en specificeret forsinkelse eller periodisk.

Lad os se på et eksempel for at se, hvordan ScheduledThreadPool fungerer.

Antag for eksempel, at vi har en opgave med at tjekke e-mail hvert 5. sekund, men dette tjek må ikke påvirke hovedprogrammet og medfører potentielt forbrug af yderligere ressourcer.

Vi har en opgaveklasse, der simulerer at tjekke e-mail.


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

Dernæst opretter vi en trådpulje og planlægger kontrollen.


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

I outputtet ser vi hvert 5. sekund:

Tjek e-mail...

Generelt kan vi bruge sådan en pulje til at udføre periodiske "husholdnings" opgaver, som i eksemplet. Husholdningsopgaver er opgaver, der skal udføres, uanset hvad hovedprogrammet laver.