有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java确保任务是可中断的

当我调用Future.cancel()时,如何确保我的任务对中断做出响应

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

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

共 (2) 个答案

  1. # 1 楼答案

    task运行中,确保在不同级别执行interrupt检查。比如:

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

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

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

  2. # 2 楼答案

    How to ensure that my tasks are responsive to interruption when I call 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的回答