Un altro tipo di pool di attività è il pool di attività pianificate. A giudicare dal nome, possiamo presumere che usiamo questo tipo per programmare quando una particolare attività dovrebbe essere avviata.

Questo tipo di servizio è utile quando abbiamo un'attività per avviare un'attività dopo che è trascorso del tempo o vogliamo programmare un'attività ricorrente.

Per usarne uno, chiamiamo Executors.newScheduledThreadPool(1) .

Parleremo dei parametri un po 'più tardi. Ma per ora, quello che dobbiamo sapere è che quando viene chiamato questo metodo otteniamo un oggetto ScheduledExecutorService .

ScheduledExecutorService è un'interfaccia che estende ExecutorService .

In questa interfaccia vengono visualizzati i seguenti metodi:

Metodo Spiegazione

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Crea ed esegue un'azione una tantum che viene eseguita dopo il ritardo specificato.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
Crea ed esegue aProgrammato Futurooggetto che viene eseguito dopo un ritardo specificato.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Crea ed esegue un'azione ricorrente che viene eseguita prima dopo il ritardo iniziale specificato e quindi di nuovo dopo il periodo specificato. In altre parole, l'esecuzione inizierà dopo initialDelay , quindi initialDelay + period , quindi initialDelay + 2 * period e così via.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
Crea ed esegue un'azione ricorrente che viene eseguita prima dopo il ritardo iniziale specificato e quindi di nuovo con il ritardo specificato tra il completamento di un'esecuzione e l'inizio della successiva.

Quindi l'interfaccia ci consente di eseguire attività a intervalli regolari o dopo un certo ritardo.

Ulteriori informazioni sul metodo newScheduledThreadPool.

Possiamo chiamarlo in diversi modi:


newScheduledThreadPool(int corePoolSize)
corePoolSize è il numero di thread da mantenere nel pool, anche se sono inattivi.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize è il numero di thread da mantenere nel pool, anche se sono inattivi.

threadFactory è la factory da utilizzare durante la creazione di nuovi thread.

Entrambi i metodi creeranno un pool di thread che può pianificare azioni da eseguire dopo un ritardo specificato o periodicamente.

Diamo un'occhiata a un esempio per vedere come funziona ScheduledThreadPool .

Supponiamo ad esempio di avere un compito di controllare la posta elettronica ogni 5 secondi, ma questo controllo non deve influire sul programma principale e comporta il potenziale consumo di risorse aggiuntive.

Abbiamo una classe di attività che simula il controllo della posta elettronica.


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

Successivamente, creiamo un pool di thread e pianifichiamo il controllo.


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

Nell'output, ogni 5 secondi vediamo:

Controllo della posta elettronica...

In generale, possiamo utilizzare un tale pool per eseguire periodiche attività di "pulizia", ​​come nell'esempio. Le attività di pulizia sono attività che devono essere eseguite indipendentemente da ciò che sta facendo il programma principale.