Как запустить группу асинхронных задач так, чтобы при ошибке выполнения одной другие продолжили выполнение?

В 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() и выводим его на консоль.

Таким образом, позволяет запустить группу асинхронных задач так, чтобы при ошибке выполнения одной из них, другие продолжили выполнение.