ciò che accade a correre / runnables bloccati quando ExecutorService è shutdown ()
-
26-09-2019 - |
Domanda
su un filo modello di oggi, e quasi tutti hanno suggerito che guardo al ExecutorService.
Mentre stavo guardando in ExecutorService, penso che mi manca qualcosa. Cosa accade se il servizio sia in esecuzione o fili bloccati, e qualcuno chiama ExecutorService.shutdown (). Cosa succede ai thread in esecuzione o bloccati?
Fa l'ExecutorService attesa per quei fili per completare prima che termina?
Il motivo che mi chiedo è perché molto tempo fa quando ho usato per dilettarsi in Java, hanno deprecato Thread.stop (), e mi ricordo il modo giusto di fermare un filo era di usare sempahores ed estendere Discussione quando necessario:
public void run () {
while (!this.exit) {
try {
block();
//do something
} catch (InterruptedException ie) {
}
}
}
public void stop () {
this.exit = true;
if (this.thread != null) {
this.thread.interrupt();
this.thread = null;
}
}
Come si comporta ExecutorService thread in esecuzione?
Soluzione
Iniziati un arresto ordinato in cui i compiti già presentati vengono eseguiti, ma sarà accettata nessuna nuova attività. Invocazione non ha alcun effetto aggiuntivo se già chiuso.
Così attenderà quei fili per completare.
L'alternativa è la ExecutorService#shutdownNow()
I tentativi di fermare tutte le attività che eseguono attivamente, fermate il trattamento dei compiti in attesa, e restituisce un elenco delle attività che sono stati in attesa di esecuzione.
Non ci sono garanzie di là tentativi di best-effort per interrompere l'elaborazione compiti esecuzione attivamente. Ad esempio, le implementazioni tipiche annulleranno via
Thread.interrupt()
, quindi qualsiasi compito che non risponde alle interruzioni non può mai terminare.
Hai solo bisogno di ascoltare su Thread#isInterrupted()
nel ciclo while
all'interno del run()
da soli.
Altri suggerimenti
Penso che la documentazione è abbastanza chiaro! Dalla memoria, si attende che i fili completa se non gli si dice altrimenti con, credo, il metodo shutdownNow ().