2013-04-18 2 views
12

Я смущен о javadoc ExecutorService#shutdown метод. Разве это не противоречивые заявления?ExecutorService shutdown

Выполняет упорядоченное завершение работы, в котором ранее заданные задачи выполнялись , но новые задачи не принимаются. Этот метод не ждет для выполнения ранее поставленных задач для завершения выполнения. Используйте awaitTermination, чтобы сделать это.

Если он может упорядочить завершение ранее отправленных задач, то как он не может дождаться завершения выполнения?

+0

Комментарий означает, что предыдущие задачи не будут отброшены. Не то, чтобы они были выполнены немедленно. Для этого используйте 'awaitTermination()'. –

+0

Процедура возвращается почти сразу, а не ждет завершения всех задач. –

ответ

13

Это означает, что метод немедленно возвращается в поток, который вы его вызываете, но задачи, которые еще не были выполнены, все еще могут выполняться в других потоках.

Если вы хотите, чтобы ваша программа дождалась завершения заданий, которые были представлены ранее, вы должны позвонить awaitTermination после звонка shutdown.

+0

Точно, это просто отделяет две проблемы. Возможно, будет случай, когда вы хотите завершить работу, не дожидаясь ожидания. – user1225148

+0

Могу ли я представить себе вызов waitTermination() как нечто вроде вызова .join() в экземпляре ExecutorService? Если я не вызываю waitTermination(), в этом случае основной поток (или поток вызывающего абонента, если быть точным) одновременно продолжается вместе с потоками ExecutorService. Если я вызову waitTermination(), основной поток прекратит выполнение до тех пор, пока потоки ExecutorService не будут выполнены. Пожалуйста, подтвердите правильность моего понимания? – RuntimeException

6

Это означает, что задачи будут выполнены до завершения, но этот метод немедленно вернется, не дожидаясь, пока это произойдет.

Итак, чисто перегрузить исполнитель, не убивая любые задачи, вы могли бы сделать:

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

В качестве альтернативы, если вы просто хотите, чтобы остановить исполнитель как можно быстрее, используйте shutdownNow().

Смежные вопросы