当使用 ExecutorService
和 Future
对象(在提交 Runnable
tasks),如果我给future的get函数指定了一个超时值,当一个 TimeoutException
被抛出?
不会。为什么会呢?除非你让它这么做。
例如,在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
}
不,它不会。此外,甚至没有试图中断任务。首先,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
只需运行这两行,程序永远不会终止! :
Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
f.get(1, TimeUnit.SECONDS);