Sobes.tech
Middle

За какво е нужен CompletableFuture в Java?

sobes.tech AI

Отговор от AI

CompletableFuture се използва за асинхронно изпълнение на задачи и съставяне на асинхронни операции. Той представлява резултата от асинхронна операция, която може да бъде завършена в бъдеще.

Основните предимства и причини за използване:

  • Асинхронно изпълнение: Позволява изпълнението на задачи във фонов режим, без да блокира основния поток.
  • Съставяне на асинхронни операции: Позволява свързването на няколко асинхронни задачи, като се определя как трябва да се изпълняват последователно или паралелно, и обработката на техните резултати.
  • Обработка на изключения: Предоставя механизми за управление на грешки в асинхронните задачи.
  • Гъвкавост: Поддържа различни методи за обработка на резултата (например прилагане на функции, изпълнение на следващата задача) и определяне на потоковете за изпълнение.

Примери за използване:

  1. Изпълнение на няколко независими задачи паралелно и изчакване тяхното завършване:

    // Пример за паралелно изпълнение на две задачи
    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(); // Изчакване за завършване и на двете задачи
    
  2. Последователни асинхронни операции:

    // Пример за последователно изпълнение
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Начална стойност");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Трансформиране на резултата
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Дължина на низа: " + length);
    });
    
  3. Обработка на изключения:

    // Пример за обработка на изключения
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Възникна грешка");
        }
        return "Успех";
    }).exceptionally(ex -> {
        System.err.println("Обработка на грешка: " + ex.getMessage());
        return "Обработена грешка"; // Запасна стойност
    });
    
    System.out.println(errorFuture.join());