Search code examples
javamultithreadingjava.util.concurrent

Ensure that a task is interruptible


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

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

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

Solution

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

    Calling future.cancel(...) will stop the task it has not been run yet. If it is being run then if you use future.cancel(true) it will interrupt the running thread.

    To stop the thread you need to test the thread interrupt flag:

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

    And you need to handle handle InterruptedException appropriately. For example:

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

    See my answer about threads not interrupting.