Что делает Future.cancel(), если не прерывать?

Из java docs on Future.cancel()

boolean cancel(boolean mayInterruptIfRunning)

Попытка отменить выполнение этой задачи. Эта попытка потерпит неудачу, если задача уже завершена, уже отменена или не может быть отменена по какой-либо другой причине. В случае успеха, и эта задача не началась при вызове отмены, эта задача никогда не должна запускаться. Если задание уже начато, , то параметр mayInterruptIfRunning определяет, должен ли поток, выполняющий эту задачу, прерваться, чтобы остановить задачу.

Мой вопрос в том, что отменяет, если mayInterruptIfRunning является ложным?
как это отменить или остановить выполнение задачи, если она уже запущена?

Ответы

Ответ 1

Если он не прерывает, он просто скажет, что будущее отменено. Вы можете проверить, что с помощью isCancelled() ничего не происходит, если вы не проверяете это вручную.

Ниже пример кода показывает, как вы могли это сделать.

private static FutureTask<String> task = new FutureTask<String>(new Callable<String>() {

    @Override
    public String call() throws Exception {
        while (!task.isCancelled()) {
            System.out.println("Running...");
            Thread.sleep(1000);
        }
        return "The End";
    }

});

public static void main(String[] args) throws InterruptedException {
    new Thread(task).start();
    Thread.sleep(1500);
    task.cancel(false);
}

Задача запускается, и после 1.5 итераций было сказано остановить. Он продолжит спать (что бы не было, если вы его прервали), а затем закончите.

Ответ 2

Мой вопрос в том, что делает отмена, если mayInterruptIfRunning является ложным? как это отменить или остановить выполнение задачи, если она уже запущена?

Если задача уже запущена, а mayInterruptIfRunning - false, то ничего не поделаешь. В Java прерывание потока считается единственным безопасным способом остановить его до завершения - и даже это требует, чтобы задача "соответствовала", проверяя прерывание в определенный интервал реализации.

Связанный: Как вы убиваете поток в Java?

Ответ 3

ничего не будет сделано, если задача уже запущена, а mayInterruptIfRunning - false,

ниже - cancel()

public boolean cancel(boolean mayInterruptIfRunning) {
    if (state != NEW)
        return false;
    if (mayInterruptIfRunning) {
        if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, INTERRUPTING))
            return false;
        Thread t = runner;
        if (t != null)
            t.interrupt();
        UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED); // final state
    }
    else if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, CANCELLED))
        return false;
    finishCompletion();
    return true;
}

мы видим, что если mayInterruptIfRunning имеет значение false, cancel() просто изменит состояние из NEW в CANCELED и вернет false, ничего не будет сделано