что происходит с запущенными/заблокированными runnables, когда executorservice выключен()

Сегодня я отправил вопрос о шаблоне потока, и почти все предлагали мне заглянуть в ExecutorService.

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

Ожидает ли ExecutorService завершения этих потоков перед завершением?

Причина, по которой я спрашиваю об этом, заключается в том, что давным-давно, когда я баловался Java, они устарели Thread.stop(), и я помню, что правильный способ остановки потока состоял в том, чтобы использовать семпахоры и расширять Thread при необходимости:

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;
    }
}

Как ExecutorService обрабатывает запущенные потоки?


person rouble    schedule 10.06.2010    source источник


Ответы (2)


Из ExecutorService#shutdown():

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

Поэтому он будет ждать завершения этих потоков.

Альтернативой является ExecutorService#shutdownNow()

Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения.

Нет никаких гарантий, кроме попыток остановить обработку активно выполняющихся задач. Например, типичные реализации будут отменяться через Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.

Вам нужно только слушать на Thread#isInterrupted() в цикле while внутри run() самостоятельно.

person BalusC    schedule 10.06.2010
comment
Ничто в документации по shutdown() не говорит о том, что поток будет прерван. Документация для shutdownNow() предполагает, что реализация может прерывать выполнение задач, но не требует этого. - person dty; 11.06.2010
comment
Во избежание путаницы я разместил свой комментарий до того, как ответ был отредактирован, чтобы правильно соответствовать документации. - person dty; 11.06.2010
comment
Я знаю. Меня просто раздражает, когда один человек публикует полезный ответ, другой публикует выдуманную правду, которая содержит больше деталей, а затем исправляет ее и получает признание... ;-) - person dty; 11.06.2010

Я думаю, что документация довольно ясна! По памяти он ожидает завершения потоков, если только вы не скажете иначе с помощью, я думаю, метода shutdownNow().

person dty    schedule 10.06.2010