未来超时是否会终止线程执行

当使用一个ExecutorServiceFuture对象(当提交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?