【发布时间】:2016-06-09 03:38:41
【问题描述】:
此代码永久阻止 future.get()。我本来期望CancellationException 或InterruptedException。谁能解释一下?
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任务永远不会启动,但第一个任务确实会被中断。所以有一个尝试停止线程。
标签: java multithreading concurrency future executorservice