当我致电Future.cancel()
时,如何确保我的任务能够对中断做出响应?
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> future = executor.submit(task);
try {
future.get(timeout, timeoutUnit);
} catch (TimeoutException e) {
future.cancel(true);
}
答案 0 :(得分:8)
当我调用Future.cancel()时,如何确保我的任务能够响应中断?
调用future.cancel(...)
将停止尚未运行的任务。如果它正在运行,那么如果你使用future.cancel(true)
它将中断正在运行的线程。
要停止线程,需要测试线程中断标志:
if (!Thread.currentThread().isInterrupted()) {
...
你需要适当地处理句柄InterruptedException
。例如:
try {
Thread.sleep(...);
} catch (InterruptedException e) {
// re-establish the interrupt condition
Thread.currentThread.interrupt();
// probably stop the thread
return;
}
请参阅我对threads not interrupting的回答。
答案 1 :(得分:2)
在task
Runnable中,确保在不同级别进行interrupt
检查。类似的东西:
while(!Thread.currentThread().isInterrupted()){
//do something
}
如果您的逻辑不是循环,那么在数据库或Web服务调用等主要计算之前检查中断状态。
这里的想法是继续检查中断状态,就像调用future.cancel(true)
时一样,它最终会中断运行task
的线程。这是一种了解何时终止的方法。