Ответ 1
Таким образом, вы можете думать об этом так:
-
shutdown()
просто сообщит службе-исполнителю, что он не может принимать новые задачи, но уже отправленные задачи продолжают выполняться -
shutdownNow()
будет делать то же самое И будет попытаться отменить уже отправленные задачи, прервав соответствующие потоки. Обратите внимание, что если ваши задачи игнорируют прерывание,shutdownNow
будет вести себя точно так же, какshutdown
.
Вы можете попробовать пример ниже и заменить shutdown
на 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...");
}