A feladatkészlet másik típusa az ütemezett feladatkészlet. A név alapján feltételezhetjük, hogy ezt a típust használjuk arra, hogy ütemezzük, mikor kell egy adott feladatot elindítani.

Ez a fajta szolgáltatás akkor hasznos, ha olyan feladatunk van, hogy bizonyos idő elteltével elindítsunk egy tevékenységet, vagy ismétlődő feladatot szeretnénk ütemezni.

Az egyik használatához az Executors.newScheduledThreadPool(1) nevet hívjuk .

A paraméterekről kicsit később beszélünk. De egyelőre tudnunk kell, hogy a metódus meghívásakor egy ScheduledExecutorService objektumot kapunk.

A ScheduledExecutorService egy interfész, amely kiterjeszti az ExecutorService szolgáltatást .

A következő módszerek jelennek meg ezen a felületen:

Módszer Magyarázat

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Létrehoz és végrehajt egy egyszeri műveletet, amely a megadott késleltetés után fut le.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Létrehozza és végrehajtja aScheduledFutureobjektum, amely meghatározott késleltetés után fut le.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Létrehoz és végrehajt egy ismétlődő műveletet, amely először a megadott kezdeti késleltetés után fut le, majd ismét a megadott időszak után. Más szavakkal, a végrehajtás a kezdetiDelay , majd az inicialDelay + periódus , majd az inicialDelay + 2 * periódus után kezdődik , és így tovább.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Létrehoz és végrehajt egy ismétlődő műveletet, amely először a megadott kezdeti késleltetés után, majd az egyik végrehajtás befejezése és a következő kezdete közötti meghatározott késleltetéssel hajtódik végre.

Így a felület lehetővé teszi, hogy rendszeres időközönként vagy némi késleltetés után feladatokat hajtsunk végre.

További információ a newScheduledThreadPool módszerről.

Többféleképpen nevezhetjük:


newScheduledThreadPool(int corePoolSize)
A corePoolSize a készletben tartandó szálak száma, még akkor is, ha tétlenek.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

A corePoolSize a készletben tartandó szálak száma, még akkor is, ha tétlenek.

A threadFactory az új szálak létrehozásakor használt gyári alap.

Mindkét módszer létrehoz egy szálkészletet, amely ütemezheti a műveletek meghatározott késleltetés utáni vagy időszakos végrehajtását.

Nézzünk egy példát a ScheduledThreadPool működésére.

Tegyük fel például, hogy van egy feladatunk, hogy 5 másodpercenként ellenőrizzük az e-maileket, de ez az ellenőrzés nem érintheti a fő programot, és további erőforrások esetleges felhasználásával jár.

Van egy feladatosztályunk, amely szimulálja az e-mailek ellenőrzését.


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

Ezután létrehozunk egy szálkészletet, és ütemezzük az ellenőrzést.


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

A kimenetben 5 másodpercenként ezt látjuk:

E-mail ellenőrzése...

Általában egy ilyen medencét használhatunk időszakos "háztartási" feladatok elvégzésére, mint a példában. A háztartási feladatok olyan feladatok, amelyeket el kell végezni, függetlenül attól, hogy a fő program mit csinál.