确保任务可中断

时间:2013-09-09 16:09:59

标签: java multithreading java.util.concurrent

当我致电Future.cancel()时,如何确保我的任务能够对中断做出响应?

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> future = executor.submit(task);

try {
    future.get(timeout, timeoutUnit);
} catch (TimeoutException e) {
    future.cancel(true);
}

2 个答案:

答案 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的线程。这是一种了解何时终止的方法。