Sobes.tech
Middle

Šta je CompletableFuture?

sobes.tech АИ

Одговор од АИ

CompletableFuture у Јави 8+ представља проширење модела Future, додајући могућности асинхроног програмирања и композиције задатака.

Он реализује интерфејсе CompletionStage и Future. CompletionStage дефинише уговор за асинхроно извршавање и композицију рачунања.

Кључне особине:

  • Неблокирајуће операције: Омогућава извршавање задатака асинхроно, без блокирања главног тока.
  • Композиција: Пружа богат API за повезивање и уједначавање резултата више асинхронних операција.
  • Обрада изузетака: Уграђени механизми за обраду грешака у асинхроним токовима.
  • Креирање: Можете креирати завршене, незавршене или грешке CompletableFuture.
  • Зависности: Омогућава креирање ланаца зависних задатака, где извршење једног зависи од завршетка другог.
  • Паралелно извршавање: Методи типа allOf и anyOf за паралелно извршавање више задатака.

Примери употребе:

  1. Креирање и завршетак:

    // Креирање завршеног CompletableFuture
    CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Здраво");
    
    // Креирање незавршеног CompletableFuture и његово касније завршетак
    CompletableFuture<String> future = new CompletableFuture<>();
    // ... извршавање асинхроног посла ...
    future.complete("Завршено");
    // Или у случају грешке
    // future.completeExceptionally(new RuntimeException("Грешка"));
    
  2. Извршавање асинхроног задатка:

    CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> {
        // Асинхрона работа (нпр. читање из фајла, мрежни захтев)
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
        return "Асињхронски резултат";
    });
    
  3. Композиција са thenApply:

    CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10)
        .thenApply(x -> x * 2); // Резултат претходног корака се преноси у функцију
    
  4. Композиција са thenCombine:

    CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
    CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
    
    CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Уједињење резултата две CompletableFuture
    
  5. Обрада завршетка са thenAccept:

    CompletableFuture.supplyAsync(() -> "Коначни резултат")
        .thenAccept(result -> System.out.println("Задача завршена са резултатом: " + result)); // Извршавање акције након завршетка без враћања вредности
    
  6. Обрада изузетака са exceptionally:

    CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> {
        throw new RuntimeException("Нешто је пошло по злу");
    }).exceptionally(ex -> {
        System.err.println("Дошло је до грешке: " + ex.getMessage());
        return "Подразумевана вредност"; // Враћање вредности по подразумевану у случају грешке
    });
    

CompletableFuture значајно олакшава писање асинхроног и неблокирајућег кода у Јави, чинећи га читљивијим и лакше одрживим у поређењу са традиционалним callback-овима или блокирајућим позивима Future.get().