Java FutureTask中的多线程如果任务超时,任务是否会被取消?
假设我有以下代码段:
FutureTask<?> f = new FutureTask<>(() -> { Thread.sleep(5000); return 1 + 2; })
myExecutor.execute(f);
f.get(3, TimeUnit.SECONDS);
根据编码,最后一行将在3秒后以java.util.concurrent.TimeoutException
失败
我的问题是:未来内部的实际工作是否继续得到执行?还是会被取消?我能在2秒钟后检索实际结果吗,还是它消失了强>
# 1 楼答案
对。除非取消任务,否则任务将正在执行
不,除非你取消,否则不会取消
对。即使在超时之后,您也可以稍后获得结果
查看示例代码段:
下面的代码获取3秒超时后的future状态。我创建了人工延迟来演示这个例子。在实时情况下,如果没有
sleep()
方法,输出将不同输出:
如果您在第行下方取消注释
输出:
# 2 楼答案
它继续被执行
通过添加第二个
f.get(3, TimeUnit.SECONDS);
,您可以检索结果:您可以通过调用
然后,当使用
它抛出一个
CancellationException