Подтвердить что ты не робот

Является ли исполнитель предназначен для повторного использования?

Является ли объектом-исполнителем подразумевается повторное использование после shutdown? Я имею в виду, если я вызову shutdown или shutdownNow после завершения исполнителя, должен ли я сделать new для создания нового пула потоков или возможно каким-то образом "reset" /повторно использовать ранее завершенный исполнитель и повторно использовать его?

Update:
Если мне нужно создать новый пул потоков, как я могу "понять", что предыдущий был остановлен?
Например. Следующее:

public void startPool(){  
   if(threadPool != null && !threadPool.isShutdown()){
    return;
   }  
   threadPool = Executors.newCachedThreadPool();  
   //other stuff

}  

public void stopPool(){  
   if(threadPool != null){  
    threadPool.shutdown();   
  }  
}   

Не получится. Если я вызову stop, а затем start, новый пул потоков не будет создан из-за условий. Каков правильный способ кодирования этого?

4b9b3361

Ответ 1

Из документ:

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

так (кратко), нет, вы не можете его повторно использовать. Из файл shutdown():

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

Методы isTerminated() и isShutdown() могут использоваться для определения того, был ли исполнитель выключен и что задачи были выполнены соответственно.

Ответ 2

1) Вы не можете повторно использовать ThreadPoolExecutor после его завершения, API

An ExecutorService can be shut down, which will cause it to reject new tasks

Примечание. Не завершайте ThreadPoolExecutor, если вы хотите его повторно использовать.

2) Если вы хотите узнать, нужно ли воссоздать использование ThreadPoolEdxecutor

ExecutorService.isShutdown()

Возвращает true, если этот исполнитель был отключен

Ответ 3

Мы говорим о Oracla Javas ThreadPoolExecutor (реализуем интерфейс Executor) здесь. Там комментарий метода при выключении явно запрещает переход Shutdown обратно в Running, но в комментарии класса перечислены все переходы, поддерживаемые ThreadPoolExecutors, и от Shutdown нет пути назад. Для возврата потребуется другой метод restart/start или подобный. Этого не существует, но тот, кто считает его полезным, может расширить интерфейс и реализовать перезапуск после завершения работы без прерывания семантики завершения. Это будет, вероятно, немного сложнее, так как сама остановка не гарантирует, что обработка в конечном итоге прекратится. Таким образом, рабочие могут продолжать, пока они не закончат, если они закончат вообще. Возможность перезапуска в этих условиях, вероятно, не стоила дополнительной работы по сравнению с просто созданием другого исполнителя.