2013-04-18 15 views
12

Sono confuso circa il javadoc del metodo ExecutorService#shutdown. Non sono queste dichiarazioni contraddittorie?ExecutorService shutdown

Avvia un arresto regolare in cui sono stati eseguiti i compiti precedentemente inviati , ma non verranno accettate nuove attività. Questo metodo non attende per le attività inviate in precedenza per completare l'esecuzione. Utilizzare Attendere il limite per farlo.

Se è possibile chiudere in modo ordinato le attività inviate in precedenza, come può non attendere il completamento dell'esecuzione?

+0

Il commento indica che le attività precedenti non verranno eliminate. Non che saranno giustiziati immediatamente. Usa 'awaitTermination()' per quello. –

+0

La routine restituisce quasi immediatamente anziché attendere che tutte le attività vengano completate. –

risposta

13

Significa che il metodo restituisce immediatamente nel thread in cui viene chiamato, ma le attività che non sono state ancora eseguite potrebbero essere ancora in esecuzione, in altri thread.

Se si desidera che il programma attenda fino a quando non sono state completate le attività inviate in precedenza, è necessario chiamare awaitTermination dopo aver chiamato shutdown.

+0

Esattamente, separa semplicemente due preoccupazioni. Potrebbero esserci dei casi in cui si desidera arrestare senza attendere. – user1225148

+0

Posso immaginare che chiamare awaitTermination() sia qualcosa come chiamare .join() sull'istanza di ExecutorService? Se non richiamo awaitTermination(), in tal caso il thread principale (o thread del chiamante, per essere precisi) continua con i thread ExecutorService contemporaneamente. Se chiamo waitTermination(), il thread principale interromperà l'esecuzione fino a quando i thread di ExecutorService non saranno eseguiti. Per favore conferma se la mia comprensione è corretta? – RuntimeException

6

Significa che le attività verranno eseguite fino al completamento, ma questo metodo verrà restituito immediatamente, senza attendere che ciò accada.

Così, a modo pulito arresto il vostro esecutore senza uccidere qualsiasi attività, si farebbe:

executor.shutdown(); 
executor.awaitTermination(long timeout, TimeUnit unit); 

In alternativa, se si desidera solo per fermare il vostro esecutore il più rapidamente possibile, utilizzare shutdownNow().