Middle
Реците о концепту класе CompletableFuture.
sobes.tech АИ
Одговор од АИ
CompletableFuture је класа у Јави 8+ која имплементира интерфејсе Future и CompletionStage. Представља асинхроно израчунавање које може бити завршено (или изазвати грешку) у неком тренутку у будућности и над његовим резултатом могу се извршавати последичне акције декларативно, без блокирања главног тока.
Главне могућности:
- Асинхроно извршавање: Омогућава покретање задатака у посебном току (или пулу токова).
- Композиција: Може се спојити више
CompletableFuture, креирајући ланце зависних акција. - Управљање изузецима: Пружа методе за обраду грешака асинхроних израчунавања.
- Неблокирајуће операције: Резултат или изузетак се обрађује када се future заврши, без јасног
get().
Кључне методе:
- Креирање:
supplyAsync(Supplier<T> supplier): ПокрећеSupplierасинхроно и враћаCompletableFutureса његовим резултатом.runAsync(Runnable runnable): ПокрећеRunnableасинхроно и враћаCompletableFuture<Void>.completedFuture(T value): Креира већ завршениCompletableFutureса задатом вредношћу.
- Преобразба:
thenApply(Function<T, U> fn): Примењује функцију на резултат када се future заврши.thenAccept(Consumer<T> action): Извршава акцију над резултатом када се future заврши.thenRun(Runnable action): Извршава акцију када се future заврши, игноришући резултат.thenCompose(Function<T, CompletionStage<U>> fn): Омогућава гранање, где се резултат једног future користи за креирање другог.
- Комбиновање:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Комбинује резултате два future.allOf(CompletableFuture<?>... cfs): ВраћаCompletableFuture<Void>који се завршава када се сви пренесени futures заврше.anyOf(CompletableFuture<?>... cfs): ВраћаCompletableFuture<Object>који се завршава када се заврши било који од пренесених futures.
- Обрада изузетака:
exceptionally(Function<Throwable, T> fn): Обрађује изузетак, враћајући алтернативну вредност.handle(BiFunction<T, Throwable, U> fn): Обрађује како резултат, тако и изузетак.
Пример:
// Покретање асинхронног задатка
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Имитација дугог рада
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Резултат асинхронске операције";
});
// Извршавање акције након завршетка задатка (не блокирајуће)
future.thenAccept(result -> {
System.out.println("Добијени резултат: " + result);
});
// Још једна акција која зависи од прве
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Резултат у великој штампи: " + upperCaseResult);
});
// Чекање на све задатке (у стварним апликацијама обично избегавају јасно get/join)
// future.join();
CompletableFuture је моћан алат за писање реактивног и не блокирајућег кода у Јави, значајно поједностављујући рад са асинхроношћу у поређењу са класичним интерфејсом Future.