【发布时间】:2019-06-23 03:05:47
【问题描述】:
正在学习Java 1.5引入的ExecutorService
以下示例似乎违背了预期的行为:
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 取消,因此任何未能响应中断的任务都可能永远不会终止。
理想情况下,我所期望的是,在指定超时后,我会得到一个超时异常,然后 ExecutorService 会强制关闭,但这并没有发生。
查看了 java 文档 - 它似乎确实表明无法保证它会关闭。
如果不能保证,那么应该避免吗?
【问题讨论】:
-
没有必要避免它,只需了解限制并确保您执行的任务将正确响应中断。
-
这不重要吗?
"...so any task that fails to respond to interrupts may never terminate."您的可调用对象如何处理中断?
标签: java multithreading executorservice