Метод thenRun
Метод thenRun класса CompletableFuture запускает переданное действие
после того, как исходная асинхронная задача завершится. Особенность этого метода
в том, что он не получает результат предыдущей задачи в качестве параметра
и не возвращает новое значение. В параметр мы передаём объект Runnable,
который содержит код для выполнения. Метод возвращает новый объект
CompletableFuture<Void>, который завершится после выполнения переданного действия.
Если исходная задача завершилась исключением, то переданное действие
не будет выполнено, а исключение будет передано в результирующий
CompletableFuture.
Синтаксис
CompletableFuture<Void> thenRun(Runnable action)
Пример
Давайте создадим асинхронную задачу через runAsync
и повесим на неё действие через thenRun:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("Task is running");
});
CompletableFuture<Void> res = future.thenRun(() -> {
System.out.println("Action after task");
});
res.join();
}
}
Результат выполнения кода:
"Task is running"
"Action after task"
Пример
Давайте используем thenRun после задачи,
которая возвращает результат через supplyAsync.
Результат при этом в действии недоступен:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "abcde";
});
CompletableFuture<Void> res = future.thenRun(() -> {
System.out.println("Done");
});
res.join();
}
}
Результат выполнения кода:
"Done"
Пример
Давайте посмотрим, что произойдёт, если исходная задача
завершится с исключением. Действие в thenRun выполнено не будет:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
throw new RuntimeException("error");
});
CompletableFuture<Void> res = future.thenRun(() -> {
System.out.println("This will not be printed");
});
try
{
res.join();
}
catch (Exception e)
{
System.out.println("Exception caught");
}
}
}
Результат выполнения кода:
"Exception caught"
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронную задачу -
метод
thenAccept,
который выполняет действие с результатом задачи -
метод
thenApply,
который преобразует результат задачи -
метод
runAsync,
который запускает асинхронную задачу без результата