У меня есть простой java 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()
в конце моей программы, но это глупо.