使用ExecutorService
andFuture
对象时(提交Runnable
任务时),如果我为future的get函数指定超时值,TimeoutException
抛出a时底层线程是否会被杀死?
问问题
63079 次
4 回答
72
它不是。为什么会呢?除非你告诉它。
例如,在 Callable 的情况下,这里有一个非常有效的问题。如果你等了 20 秒后没有得到结果,那么你就不再对结果感兴趣了。那时你应该完全取消任务。
像这样的东西:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
于 2013-04-26T08:22:42.953 回答
18
不,它没有。Morover甚至没有尝试打断任务。首先,带有超时的 Future.get 并没有这么说。其次,试试我的测试,看看它的表现如何
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
在 1 秒内打印
Exception in thread "main" java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
at java.util.concurrent.FutureTask.get(FutureTask.java:91)
at Test1.main(Test1.java:23)
再过 1 秒,任务成功完成
finished
于 2013-04-26T08:08:53.540 回答
5
于 2013-04-26T08:11:41.460 回答
-1
只需运行这两行,程序就永远不会终止!:
Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
f.get(1, TimeUnit.SECONDS);
于 2020-06-16T13:16:29.613 回答