А ЦомплтаблеФутуре се користи за асинхроно програмирање. Асинхроно програмирање подразумева писање кода који не блокира. Покреће задатак на посебној нити од главне нити апликације и обавештава главну нит о његовом напретку, завршетку или неуспеху.
На овај начин главна нит не блокира нити чека завршетак задатка. Остали задаци се извршавају паралелно. Паралелизам побољшава перформансе програма.
ЦомплетаблеФутуре је класа у Јави. Припада пакету јава.утил.цоцуррент. Имплементира интерфејс ЦомплетионСтаге и Футуре.
ЦомплетионСтаге
- Изводи радњу и враћа вредност када се заврши друга фаза завршетка.
- Модел за задатак који може покренути друге задатке.
Дакле, то је елемент ланца.
Када више од једне нити покуша да заврши - заврши изузетно или откаже ЦомплетаблеФутуре, само једна од њих успе.
јава динамички низ
Футуре вс. ЦомплетаблеФутуре
ЦомплетаблеФутуре је проширење за Јава-ин Футуре АПИ који је представљен у Јави 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);