2016-03-14 23 views
8

ScheduledExecutorService eredita due metodi da ExecutorService, shutdown() e shutdownNow(). La differenza tra loro:Miscela di shutdown() e shutdownNow()

shutdown avvia uno spegnimento ordinato in cui vengono eseguite attività precedentemente inoltrate, ma non verranno accettate nuove attività. L'invocazione non ha alcun effetto aggiuntivo se è già stata chiusa.

shutdownNow tenta di interrompere tutte le attività che eseguono attivamente, interrompe l'elaborazione delle attività in attesa e restituisce un elenco delle attività che erano in attesa di esecuzione.

Ora voglio interrompere l'elaborazione delle attività di attesa mentre non voglio interrompere le attività di esecuzione in corso. Non riesco ad interrompere i thread perché le librerie di terze parti sono coinvolte e non si adattano bene agli interrupt :-(Ma ho bisogno di cancellare le attività scheduled, che non sono attualmente in esecuzione poiché la maggior parte di esse sono programmate in un'ora o giù di lì.

Qual è il modo migliore per affrontare questo Quali opzioni devo

+0

Una combinazione di 'shutdown' e [' awaitermination'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination-long-java. util.concurrent.TimeUnit-) deve fare il trucco. – marcospereira

+0

@marcospereira 'awaitermination' attenderà fino al termine dell'ultima operazione pianificata. – steffen

risposta

4

Suona come chiamare setExecuteExistingDelayedTasksAfterShutdownPolicy(false) sul vostro esecutore dovrebbe fare il trucco:??

Imposta la politica relativa all'esecuzione o meno esistenti in ritardo attività anche quando questo esecutore è stato arrestato. In questo caso, queste attività saranno solo terminare su shutdownNow o dopo aver impostato il criterio su false quando è già stato arrestato. Questo valore è di default true.

Poiché è true per impostazione predefinita, queste attività vengono eseguite. Se lo si imposta su false, non dovrebbero essere più eseguiti. Questo non dovrebbe essere confuso con inviato attività a cui si riferiscono i documenti citati. Stanno semplicemente aspettando in coda per essere giustiziati subito, quando c'è un lavoratore libero.

+0

Questo è un metodo facilmente rintracciabile ... –

+0

Sì, funziona benissimo! Ho dimenticato questo metodo in quanto appartiene a 'ScheduledThreadPoolExecutor' e' Executors.newScheduledThreadPool (int) 'restituisce l'interfaccia' ScheduledExecutorService'. Ora creo me stesso la STPE. Grazie! – steffen