一段时间后彻底杀死未来

时间:2018-10-31 21:35:01

标签: java java-8

我有一个future做一些繁重的工作。我称future为超时。如果超时,我会向客户端抛出异常,并创建另一个scheduledfuture以最终在一段时间后取消第一个future。想法是在future的初始超时后给一个时间来完成其任务,但是如果在那个时间内没有完成,则将其杀死。

我的代码看起来像

try {
    return future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException) {
   //create a scheduledfuture here which waits for another 5s
   // and kill the above future is it is still not done
   //the callable of scheduledfuture looks like -
   /*
   if (!future.isDone()) {
       future.cancel(true);
   }
   */
}

这里有两个问题-
1. future.cancel(true)只会将中断标志设置为true。它不会照原样结束任务。我应该如何结束任务?内部是否有一个JVM进程可以检查线程是否存在中断标志,如果为true,则终止它们?
2.由于现在设置了中断标志,因此在任务完成之后,是否有一个过程可以重置该标志?否则,在尝试处理包含阻塞调用的下一个请求时,通过ExecutorService管理的线程将因InterruptedException而失败。

1 个答案:

答案 0 :(得分:2)

  

我应该如何结束任务?

运行任务是一个单独的过程,请终止该过程以停止它。除非已对该任务进行了编码以支持该线程,否则没有安全的方法来停止Java中的线程。

  

由于任务完成后现在设置了中断标志,是否有重置标志的过程?

是的,ExecutorService重置中断标志。