Как правильно отключить Java ExecutorService
У меня простая яваExecutorService
который запускает некоторые объекты задачи (реализуетCallable
).
ExecutorService exec = Executors.newSingleThreadExecutor();
List<CallableTask> tasks = new ArrayList<>();
// ... create some tasks
for (CallableTask task : tasks) {
Future future = exec.submit(task);
result = (String) future.get(timeout, TimeUnit.SECONDS);
// TASKS load some classes and invoke their methods (they may create additional threads)
// ... catch interruptions and timeouts
}
exec.shutdownNow();
После того, как все задачи выполнены (DONE или TIMEOUT-ed), я пытаюсь завершить работу исполнителя, но он не остановится:exec.isTerminated() = FALSE.
Я подозреваю, что некоторые задачи, которые отсрочены, не завершены должным образом.
И да, я знаю, что отключение исполнителя ничего не гарантирует:
Нет никаких гарантий, кроме попыток изо всех сил прекратить обработку активно выполняемых задач. Например, типичные реализации будут отменены через {@link Thread # interrupt}, поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
Мой вопрос, есть ли способ гарантировать, что эти (задачи) потоки будут прекращены? Лучшее решение, которое я придумал, это позвонитьSystem.exit()
в конце моей программы, но это глупо.