Middle
Šta je CompletableFuture?
sobes.tech АИ
Одговор од АИ
CompletableFuture у Јави 8+ представља проширење модела Future, додајући могућности асинхроног програмирања и композиције задатака.
Он реализује интерфејсе CompletionStage и Future. CompletionStage дефинише уговор за асинхроно извршавање и композицију рачунања.
Кључне особине:
- Неблокирајуће операције: Омогућава извршавање задатака асинхроно, без блокирања главног тока.
- Композиција: Пружа богат API за повезивање и уједначавање резултата више асинхронних операција.
- Обрада изузетака: Уграђени механизми за обраду грешака у асинхроним токовима.
- Креирање: Можете креирати завршене, незавршене или грешке
CompletableFuture. - Зависности: Омогућава креирање ланаца зависних задатака, где извршење једног зависи од завршетка другог.
- Паралелно извршавање: Методи типа
allOfиanyOfза паралелно извршавање више задатака.
Примери употребе:
-
Креирање и завршетак:
// Креирање завршеног CompletableFuture CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Здраво"); // Креирање незавршеног CompletableFuture и његово касније завршетак CompletableFuture<String> future = new CompletableFuture<>(); // ... извршавање асинхроног посла ... future.complete("Завршено"); // Или у случају грешке // future.completeExceptionally(new RuntimeException("Грешка")); -
Извршавање асинхроног задатка:
CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> { // Асинхрона работа (нпр. читање из фајла, мрежни захтев) try { Thread.sleep(1000); } catch (InterruptedException e) { throw new IllegalStateException(e); } return "Асињхронски резултат"; }); -
Композиција са
thenApply:CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10) .thenApply(x -> x * 2); // Резултат претходног корака се преноси у функцију -
Композиција са
thenCombine:CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20); CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Уједињење резултата две CompletableFuture -
Обрада завршетка са
thenAccept:CompletableFuture.supplyAsync(() -> "Коначни резултат") .thenAccept(result -> System.out.println("Задача завршена са резултатом: " + result)); // Извршавање акције након завршетка без враћања вредности -
Обрада изузетака са
exceptionally:CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("Нешто је пошло по злу"); }).exceptionally(ex -> { System.err.println("Дошло је до грешке: " + ex.getMessage()); return "Подразумевана вредност"; // Враћање вредности по подразумевану у случају грешке });
CompletableFuture значајно олакшава писање асинхроног и неблокирајућег кода у Јави, чинећи га читљивијим и лакше одрживим у поређењу са традиционалним callback-овима или блокирајућим позивима Future.get().