Метод cancel
Метод cancel класса Future пытается отменить выполнение задачи.
В первый параметр мы передаем булево значение mayInterruptIfRunning:
если передать true, то поток, выполняющий задачу, будет прерван,
если передать false, то уже запущенной задаче будет позволено завершиться.
Метод возвращает true, если задача была успешно отменена,
и false, если отмена не удалась (например, задача уже завершена,
уже отменена или отмена невозможна по каким-либо причинам).
После успешной отмены метод get будет выбрасывать CancellationException.
Синтаксис
boolean cancel(boolean mayInterruptIfRunning)
Пример
Давайте создадим задачу, которая выполняется достаточно долго, а затем попробуем её отменить:
import java.util.concurrent.*;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
return "interrupted";
}
return "abcde";
});
boolean res = future.cancel(true);
System.out.println(res);
System.out.println(future.isCancelled());
}
}
Результат выполнения кода:
true
true
Пример
Давайте попробуем отменить задачу, которая уже завершилась.
В этом случае метод cancel вернет false:
import java.util.concurrent.*;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.completedFuture("abcde");
boolean res = future.cancel(true);
System.out.println(res);
System.out.println(future.isCancelled());
}
}
Результат выполнения кода:
false
false
Пример
Давайте отменим задачу и попробуем получить её результат через метод get.
Это приведет к исключению CancellationException:
import java.util.concurrent.*;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
return "interrupted";
}
return "abcde";
});
future.cancel(true);
try
{
future.get();
}
catch (CancellationException e)
{
System.out.println("task was cancelled");
}
catch (InterruptedException | ExecutionException e)
{
System.out.println("error");
}
}
}
Результат выполнения кода:
"task was cancelled"
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронную задачу -
метод
complete,
который завершает задачу значением -
метод
completeExceptionally,
который завершает задачу исключением -
метод
isCancelled,
который проверяет, была ли задача отменена