java - 确保任务是可中断的

标签 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);
}

最佳答案

How to ensure that my tasks are responsive to interruption when I call Future.cancel()?

调用 future.cancel(...) 将停止尚未运行的任务。如果它正在运行,那么如果您使用 future.cancel(true) 它将中断正在运行的线程。

要停止线程,您需要测试线程中断标志:

if (!Thread.currentThread().isInterrupted()) {
   ...

并且您需要适本地处理 handle InterruptedException。例如:

try {
    Thread.sleep(...);
} catch (InterruptedException e) {
    // re-establish the interrupt condition
    Thread.currentThread.interrupt();
    // probably stop the thread
    return;
}

请参阅我关于 threads not interrupting 的回答.

关于java - 确保任务是可中断的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18702482/

相关文章:

java - 为什么主线程在启动第一个线程后等待?

java - in.next() 在做什么?

Java - Dekkers 算法实现导致临界区中有两个线程

java - 如何将实现特定接口(interface)的任何类作为参数传递并使用其方法?

multithreading - 如何在 Iron 框架中启用线程功能?

c# - 是否可以启动相同的线程?

java - 可变实例对象的可见性

java - 如何学习线程,尤其是在 Java 中

java - 使用 Spring 配置文件的 JBoss 7 多个 log4j 配置

java - 使用信号量的变量结果