Middle
За какво е нужен CompletableFuture в Java?
sobes.tech AI
Отговор от AI
CompletableFuture се използва за асинхронно изпълнение на задачи и съставяне на асинхронни операции. Той представлява резултата от асинхронна операция, която може да бъде завършена в бъдеще.
Основните предимства и причини за използване:
- Асинхронно изпълнение: Позволява изпълнението на задачи във фонов режим, без да блокира основния поток.
- Съставяне на асинхронни операции: Позволява свързването на няколко асинхронни задачи, като се определя как трябва да се изпълняват последователно или паралелно, и обработката на техните резултати.
- Обработка на изключения: Предоставя механизми за управление на грешки в асинхронните задачи.
- Гъвкавост: Поддържа различни методи за обработка на резултата (например прилагане на функции, изпълнение на следващата задача) и определяне на потоковете за изпълнение.
Примери за използване:
-
Изпълнение на няколко независими задачи паралелно и изчакване тяхното завършване:
// Пример за паралелно изпълнение на две задачи CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { // Дълга операция 1 return "Резултат 1"; }); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { // Дълга операция 2 return "Резултат 2"; }); CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2); combinedFuture.join(); // Изчакване за завършване и на двете задачи -
Последователни асинхронни операции:
// Пример за последователно изпълнение CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Начална стойност"); CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> { // Трансформиране на резултата return result.length(); }); transformedFuture.thenAccept(length -> { System.out.println("Дължина на низа: " + length); }); -
Обработка на изключения:
// Пример за обработка на изключения CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> { if (true) { throw new RuntimeException("Възникна грешка"); } return "Успех"; }).exceptionally(ex -> { System.err.println("Обработка на грешка: " + ex.getMessage()); return "Обработена грешка"; // Запасна стойност }); System.out.println(errorFuture.join());