logo

Шта је ЦомплетаблеФутуре?

А ЦомплтаблеФутуре се користи за асинхроно програмирање. Асинхроно програмирање подразумева писање кода који не блокира. Покреће задатак на посебној нити од главне нити апликације и обавештава главну нит о његовом напретку, завршетку или неуспеху.

На овај начин главна нит не блокира нити чека завршетак задатка. Остали задаци се извршавају паралелно. Паралелизам побољшава перформансе програма.

ЦомплетаблеФутуре је класа у Јави. Припада пакету јава.утил.цоцуррент. Имплементира интерфејс ЦомплетионСтаге и Футуре.

ЦомплетионСтаге

  • Изводи радњу и враћа вредност када се заврши друга фаза завршетка.
  • Модел за задатак који може покренути друге задатке.

Дакле, то је елемент ланца.

Када више од једне нити покуша да заврши - заврши изузетно или откаже ЦомплетаблеФутуре, само једна од њих успе.

јава динамички низ

Футуре вс. ЦомплетаблеФутуре

ЦомплетаблеФутуре је проширење за Јава-ин Футуре АПИ који је представљен у Јави 8.

Будућност се користи за асинхроно програмирање. Обезбеђује две методе, исДоне() и гет(). Методе преузимају резултат израчунавања када се оно заврши.

Ограничења будућности

  • Будућност не може бити међусобно потпуна.
  • Не можемо да извршимо даље радње на резултату будућности без блокирања.
  • Будућност нема руковање изузетком.
  • Не можемо комбиновати више будућности.

Будућност има толико ограничења, зато имамо ЦомплетаблеФутуре. ЦомплетаблеФутуре пружа широк скуп метода за креирање више будућности, уланчавање и комбиновање. Такође има свеобухватну подршку за обраду изузетака.

Креирање ЦомплетаблеФутуре

Можемо да креирамо ЦомплетаблеФутуре само коришћењем следећег конструктора без аргумената.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Пример

Најчешће коришћене методе ЦомплетаблеФутуре су:

    снабдевањеАсинц():Довршава свој посао асинхроно. Резултат добављача покреће задатак из ФоркЈоинПоол.цоммонПоол() као подразумевани. Метода супплиАсинц() враћа ЦомплетаблеФутуре на коју можемо применити друге методе.затим Примени():Метод прихвата функцију као аргумент. Враћа нову ЦомплетаблеСтаге када се ова фаза нормално заврши. Нова фаза користи као аргумент достављеној функцији.придружити():метода враћа вредност резултата када је завршена. Такође избацује изузетак ЦомплетионЕкцептион (непроверен изузетак) ако се изузетно заврши.
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

Излаз:

ЦомплетаблеФутуре у Јави

Управљање изузетком ЦомплетаблеФутуре

Размотрите следећу слику, која представља пет ЦФ-ова:

ЦомплетаблеФутуре у Јави

Претпоставимо да пет ЦФ-ова у извршењу и ЦФ21 покреће изузетак онда су сви зависни ЦФ (ЦФ31 и ЦФ41) у грешци. То значи да:

  • Позив методе исЦомплетедЕкцептионалли() враћа тачно.
  • Позив гет() избацује ЕкецутионЕкцептион који узрокује основни изузетак.

Размотрите следећу слику на којој смо креирали ЦФ30 са изузетком.

садржи јава метод
ЦомплетаблеФутуре у Јави

Када се ЦФ21 извршава нормално, онда ЦФ30 само преноси вредност. Ако изазове изузетак, ЦФ30 га обрађује и генерише вредност за ЦФ31.

Постоје три метода за руковање изузетком:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);