En annen type oppgavegruppe er den planlagte oppgavegruppen. Etter navnet å dømme kan vi anta at vi bruker denne typen for å planlegge når en bestemt oppgave skal startes.

Denne typen tjenester er nyttig når vi har en oppgave som skal starte en aktivitet etter at det har gått noe tid, eller vi ønsker å planlegge en gjentakende oppgave.

For å bruke en, kaller vi Executors.newScheduledThreadPool(1) .

Vi vil snakke om parametrene litt senere. Men for nå, det vi trenger å vite er at når denne metoden kalles, får vi et ScheduledExecutorService -objekt.

ScheduledExecutorService er et grensesnitt som utvider ExecutorService .

Følgende metoder vises i dette grensesnittet:

Metode Forklaring

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Oppretter og utfører en engangshandling som kjører etter den angitte forsinkelsen.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Oppretter og utfører enScheduledFutureobjekt som kjøres etter en spesifisert forsinkelse.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Oppretter og utfører en gjentakende handling som kjører først etter den angitte innledende forsinkelsen og deretter igjen etter den angitte perioden. Med andre ord vil kjøringen starte etter initialDelay , deretter initialDelay + periode , deretter initialDelay + 2 * periode , og så videre.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Oppretter og utfører en gjentakende handling som utføres først etter den angitte innledende forsinkelsen, og deretter igjen med den spesifiserte forsinkelsen mellom fullføringen av en utførelse og starten av den neste.

Så grensesnittet lar oss kjøre oppgaver med jevne mellomrom eller etter litt forsinkelse.

Mer om den nye ScheduledThreadPool-metoden.

Vi kan kalle det på flere måter:


newScheduledThreadPool(int corePoolSize)
corePoolSize er antall tråder som skal holdes i bassenget, selv om de er inaktive.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize er antall tråder som skal holdes i bassenget, selv om de er inaktive.

threadFactory er fabrikken som skal brukes når du oppretter nye tråder.

Begge metodene vil opprette en trådpool som kan planlegge handlinger som skal utføres etter en spesifisert forsinkelse eller periodisk.

La oss se på et eksempel for å se hvordan ScheduledThreadPool fungerer.

Anta for eksempel at vi har en oppgave å sjekke e-post hvert 5. sekund, men denne kontrollen må ikke påvirke hovedprogrammet og medfører potensielt forbruk av ekstra ressurser.

Vi har en oppgaveklasse som simulerer å sjekke e-post.


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

Deretter oppretter vi en trådpool og planlegger sjekken.


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

I utgangen ser vi hvert 5. sekund:

Sjekker e-post...

Generelt kan vi bruke et slikt basseng til å utføre periodiske "housekeeping"-oppgaver, som i eksemplet. Husstellsoppgaver er oppgaver som skal utføres uavhengig av hva hovedprogrammet gjør.