Этот код постоянно блокируется на future.get()
. Я ожидал бы CancellationException
или InterruptedException
. Может кто-нибудь объяснить это?Выполнение JavaService.shutdownNow() не отменяет или прерывает поток
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {/*squelch*/}
});
Future<Integer> future = es.submit(() -> 1);
es.shutdownNow();
try {
future.get();
} catch (ExecutionException e) {e.printStackTrace();}
docs говорят, что нет никаких гарантий, но я до сих пор находят наблюдаемое поведение странно, потому что это означает, что отказы остановить вызваны вспылила нитями. В этом случае, похоже, нет попытки остановить поток.
Нет гарантий, не требующих больших усилий, чтобы остановить обработку, активно выполняющую задачи. Например, типичные реализации будут отменены через Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не прекратиться.
Задача 'future' никогда не запускается, но первая задача прервана. Таким образом, есть попытка остановить поток. – matt