2010-06-10 1 views
3

Сегодня я опубликовал question о шаблоне нити, и почти все предложили мне посмотреть в 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 обрабатывает потоки?

ответ

9

От ExecutorService#shutdown():

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

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

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

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

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

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

+1

Ничего в документации для shutdown() говорит, что поток будет прерван. Документация для shutdownNow() предполагает, что реализация может прервать выполняемые задачи, но не требует этого. – dty

+1

Чтобы избежать путаницы, я отправил свой комментарий перед тем, как был отредактирован ответ, чтобы правильно соответствовать документации. – dty

+1

@ Danny - вы можете просто удалить ваши комментарии ... –

1

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

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