Разница между shutdown и shutdownNow службы исполнителя



Я хочу знать основную разницу между shutdown() и shutdownNow() остановки Executor Service ?Насколько я понял shutdown() должно использоваться для изящный завершение работы, что означает, что все задачи, которые были запущены и поставлены в очередь для обработки, но не запущены, должны быть разрешены для завершения и shutdownNow() тут крутой завершение работы означает, что некоторые незавершенные задачи отменяются, а неустановленные задачи также отменяются . Есть что-то, что неявное / явное, что я отсутствую ?



P. S: Я нашел еще один вопрос на так связанные с этим, но не совсем то, что я хочу знать .

620   3  

3 ответов:

в общем, вы можете думать об этом так:

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

вы можете попробовать пример ниже и заменить shutdown by shutdownNow чтобы лучше понять различные пути выполнения:

  • С shutdown выход Still waiting after 100ms: calling System.exit(0)... потому что запущенная задача не прерывается и продолжает работать.
  • С shutdownNow выход interrupted и Exiting normally... потому что запущенная задача прерывается, ловит прерывание, а затем останавливает то, что он делает (разрывает цикл while).
  • С shutdownNow, Если вы закомментируйте строки в цикле while, вы получите Still waiting after 100ms: calling System.exit(0)... потому что прерывание больше не обрабатывается запущенной задачей.
public static void main(String[] args) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.submit(new Runnable() {

        @Override
        public void run() {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("interrupted");
                    break;
                }
            }
        }
    });

    executor.shutdown();
    if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
        System.out.println("Still waiting after 100ms: calling System.exit(0)...");
        System.exit(0);
    }
    System.out.println("Exiting normally...");
}
  • shutdown():

для завершения потоков внутри ExecutorService вы вызываете его shutdown() метод. ExecutorService не завершит работу немедленно, но он больше не будет принимать новые задачи, и как только все потоки закончили текущие задачи, ExecutorService завершает работу. Все задачи, переданные в Службу ExecutorService перед вызовом shutdown (), выполняются.

  • shutdownNow():

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

С javadocs:

void shutdown

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

List<Runnable> shutdownNow()

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

здесь никаких гарантий за наилучшие попытки остановить обработка активно выполнения поставленных задач.

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

возвращает: список задач, которые никогда не начинали выполнение

Comments

    Ничего не найдено.