Я изучаю ExecutorService, представленный в Java 1.5
Кажется, что следующий пример не соответствует ожидаемому поведению:
public static void main(String[] args) throws InterruptedException,
ExecutionException,TimeoutException {
Callable<String> task = () -> {
int counter = 0;
while(true) {
//infinite loop will never exit
if(counter == 7) {
break;
}
}
return "abc";
};
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Future<String> future = service.submit(task);
System.out.println("result = " + future.get(10000,TimeUnit.MILLISECONDS));
}finally {
System.out.println("<<<< finally >>>>");
service.shutdownNow();
}
}
Просмотр документации по Java для этого метода:
Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения.
Этот метод не ожидает завершения активно выполняемых задач.Используйте awaitTermination, чтобы сделать это.
Нет никаких гарантий, кроме попыток изо всех сил прекратить обработку активно выполняемых задач.Например, типичные реализации будут отменены через Thread.interrupt, поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
Так что в идеале я ожидал, что после указанного времени ожидания я получу Timeoutисключение, а затем ExecutorService принудительно завершит работу, но этого не произойдет.
Посмотрел документ Java - и, похоже, он указывает на то, что нет никаких гарантий, что он выключится.
Если егоне гарантировано, тогда этого следует избегать?