3

如何确保我的任务在我打电话时对中断做出响应Future.cancel()

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

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

2 回答 2

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;
}

请参阅我关于线程不中断的回答。

于 2013-09-09T16:13:17.467 回答
2

在您的taskRunnable 中,确保在不同级别进行interrupt检查。就像是:

while(!Thread.currentThread().isInterrupted()){
    //do something
}

如果您的逻辑不是循环之类的,那么在主要计算(如数据库或 Web 服务调用)之前检查中断状态。

这里的想法是在调用时继续检查中断状态future.cancel(true),它最终会中断你的线程运行task。这是一种知道何时终止的方法。

于 2013-09-09T16:12:05.973 回答