我有一个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
而失败。
答案 0 :(得分:2)
我应该如何结束任务?
运行任务是一个单独的过程,请终止该过程以停止它。除非已对该任务进行了编码以支持该线程,否则没有安全的方法来停止Java中的线程。
由于任务完成后现在设置了中断标志,是否有重置标志的过程?
是的,ExecutorService重置中断标志。