Как правильно отключить 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() в конце моей программы, но это глупо.

Ответы на вопрос(2)

Ваш ответ на вопрос