未来超时是否会终止线程执行
2022-08-31 15:00:23
使用 and 对象时(提交任务时),如果我为 future 的 get 函数指定了超时值,那么当抛出 a 时,底层线程是否会被终止?ExecutorService
Future
Runnable
TimeoutException
使用 and 对象时(提交任务时),如果我为 future 的 get 函数指定了超时值,那么当抛出 a 时,底层线程是否会被终止?ExecutorService
Future
Runnable
TimeoutException
事实并非如此。为什么会这样呢?除非你告诉它。
例如,在可调用的情况下,这里有一个非常有效的问题。如果您等待结果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 with timeout 并没有这么说。其次,尝试我的测试,看看它的行为
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