Как остановить выполнение Executor ThreadPool в Java? - PullRequest
22 голосов
/ 13 октября 2009

Я работаю над Executors в java, чтобы одновременно запускать больше потоков одновременно. У меня есть набор Runnable Objects, и я назначаю его для Exceutors. Исполнитель работает нормально и все в порядке. Но после того, как все задачи выполнены в пуле, java-программа не завершается, я думаю, что Исполнителю требуется некоторое время, чтобы уничтожить потоки. Пожалуйста, помогите мне сократить время, затрачиваемое исполнителем после выполнения. все задачи.

Ответы [ 2 ]

22 голосов
/ 13 октября 2009

Класс ExecutorService имеет 2 метода только для этого: shutdown () и shutdownNow () .

После использования метода shutdown () вы можете вызвать awaitTermination () для блокировки до завершения всех запущенных задач. Вы можете даже указать тайм-аут, чтобы избежать ожидания навсегда.

Возможно, вы захотите нажать на некоторые из этих ссылок, которые я предоставляю. Они идут прямо в документы, где вы можете сами прочитать материалы.

10 голосов
/ 12 апреля 2012

executor.shutdown () с awaitTermination (timeout) не убивает потоки. (т.е.), если ваша работоспособная задача находится внутри цикла опроса, она не убивает задачу. Все, что он делает, это прерывает его работоспособные задачи, когда время ожидания истекло. Таким образом, в коде вашего исполняемого класса, если вы ожидаете какое-то условие, вы можете изменить условие на

while (flagcondition && !Thread.currentThread().isInterrupted()) {}

Это гарантирует, что задача останавливается, когда поток прерывается, когда завершается цикл while. Кроме того, вы можете перехватить прерванное исключение и установить flag = false в блоке catch для завершения потока.

try {
    // do some stuff and perform a wait that might throw an InterruptedException
} catch (InterruptedException e) {
    flagcondition = false;
}

Вы также можете использовать профилировщик, чтобы проверить, почему некоторые потоки не завершены.

...