未来超时是否会终止线程执行
当使用一个ExecutorService
和Future
对象(当提交Runnable
任务时),如果我为将来的get函数指定一个超时值,当抛出TimeoutException
时,底层线程是否被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超时并不这么说。 其次,尝试我的testing,看看它的行为
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
看来你需要杀死,明确取消或closures任务
处理来自Java ExecutorService任务的exception
如何在TimeoutException后返回FutureTask?