当使用ExecutorService
和Future
个对象(提交Runnable
任务时)时,如果我为未来的get函数指定了超时值,那么当{ {1}}被抛出?
答案 0 :(得分:50)
没有。为什么会这样?除非你告诉它。
例如,在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
}
答案 1 :(得分:16)
不,它没有。 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
答案 2 :(得分:4)
您似乎需要明确地终止,取消或关闭任务
答案 3 :(得分:0)
只需运行这两行,程序就不会终止! :
Future<?> f = Executors.newSingleThreadExecutor().submit(() -> System.out.println("done"));
f.get(1, TimeUnit.SECONDS);