что происходит с запущенными / заблокированными исполняемыми файлами при выключении executorservice () - PullRequest
3 голосов
/ 11 июня 2010

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

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

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

Причина, по которой я спрашиваю об этом, состоит в том, что давным-давно, когда я занимался в Java, они устарели Thread.stop (), и я помню, что правильным способом остановки потока было использование sempahores и расширение 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 обрабатывает запущенные потоки?

Ответы [ 2 ]

9 голосов
/ 11 июня 2010

С ExecutorService#shutdown():

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

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

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

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

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

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

1 голос
/ 11 июня 2010

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

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