В Java для выполнения асинхронных задач с возможностью продолжения работы при ошибке можно использовать механизм CompletableFuture. CompletableFuture предоставляет способ работы с асинхронными операциями и обработки исключений.
Чтобы запустить группу асинхронных задач, вы можете создать массив CompletableFuture и запустить каждую задачу при помощи метода supplyAsync() или runAsync(). Метод supplyAsync() позволяет выполнить вычисление асинхронно и вернуть результат, а метод runAsync() позволяет выполнить вычисление асинхронно и не возвращать результат.
Пример кода:
import java.util.concurrent.CompletableFuture; public class AsyncTasks { public static void main(String[] args) { // Создаем массив CompletableFuture CompletableFuture[] tasks = new CompletableFuture[3]; // Запускаем каждую задачу асинхронно tasks[0] = CompletableFuture.supplyAsync(() -> { // Выполнение задачи 1 return "Результат задачи 1"; }); tasks[1] = CompletableFuture.supplyAsync(() -> { // Выполнение задачи 2 throw new RuntimeException("Ошибка выполнения задачи 2"); }); tasks[2] = CompletableFuture.supplyAsync(() -> { // Выполнение задачи 3 return "Результат задачи 3"; }); // Дожидаемся завершения всех задач CompletableFuture.allOf(tasks) .exceptionally(throwable -> { // Обработка ошибки, которая произошла в одной из задач System.out.println("Произошла ошибка: " + throwable.getMessage()); return null; }) .join(); // Получение результатов всех задач for (CompletableFuture task : tasks) { if (task.isCompletedExceptionally()) { // Задача завершилась с ошибкой continue; } System.out.println("Результат задачи: " + task.join()); } } }
В этом примере мы создаем три асинхронные задачи, выполняющиеся параллельно. Задача 2 выбрасывает RuntimeException. Мы используем CompletableFuture.allOf() для дожидания завершения всех задач и CompletableFuture.exceptionally() для обработки ошибки, если она произошла в одной из задач.
Затем мы проходим по массиву задач и проверяем статус каждой задачи при помощи метода isCompletedExceptionally(). Если задача завершилась с ошибкой, мы игнорируем ее. Если же задача успешно завершилась, мы получаем результат при помощи метода join() и выводим его на консоль.
Таким образом, позволяет запустить группу асинхронных задач так, чтобы при ошибке выполнения одной из них, другие продолжили выполнение.