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 |
---|---|
|
Opretter og udfører en engangshandling, der kører efter den angivne forsinkelse. |
|
Opretter og udfører enScheduledFutureobjekt, der udføres efter en specificeret forsinkelse. |
|
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. |
|
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:
|
corePoolSize er antallet af tråde, der skal opbevares i poolen, selvom de er inaktive. |
|
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:
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.
GO TO FULL VERSION