Programarea reactiva in Java. CompletableFuture si Async

Luxoft Training
3 min readOct 12, 2021

--

Ultimul articol din seria noastra legata de programarea reactiva. De aceasta data ne uitam la impactul CompletableFuture si Async.

CompletableFuture si lumea Async

In Java 8, aveam CompletableFuture, care este bazat pe Fork/Join framework. Exact ca parallelizing threads. De fapt, Fork/Join framework a aparut in Java 7, dar era dificil de folosit. In Java 8, CompletableFuture a devenit un fel de pas inainte spre lumea async.

Hai sa ne uitam la un exemplu simplu. In codul de mai jos, metodele CompletableFuture din cadrul unui JDK standard sunt marcate cu portocaliu.

Sa presupunem ca avem un API care ne permite sa:

  • Citim datele (readData) de la sursa si sa redea CompletableFuture, deoarece este asincron
  • Procesam datele, pentru care exista 2 procesori: processData1 si processData2
  • Combinam datele (mergeData) dupa ce sunt procesate
  • Scriem date (writeData) catre receiver (Destination)

Aceasta este o sarcina tipica — citirea datelor, procesarea lor in doua threaduri, apoi combinarea rezultatelor generate de procesare si scrierea lor undeva.

Am citit datele:

CompletableFuture data = readData(source);

Apoi spunem: o data ce datele sunt citite, ar trebui trimise catre procesare:

CompletableFuture processData1 = data.thenApplyAsync(this::processData1);

Asta inseamna ca ar trebui sa incepem procesarea lor intr-un thread separat. Pe masura ce folosim Async postfix aici, procesarea incepe in doua threaduri diferite:

CompletableFuture processData2 = data.thenApplyAsync(this::processData2);

Functiile this::processData1 si this::processData2 vor incepe in doua threaduri diferite si executate in paralel. Dar dupa executia paralela, rezultatele ar trebui combinate. Acest lucru este facut prin intermediul thenCombine.

Aici am inceput doua threaduri de executie, si odata ce au fost finalizate, le-am combinat. Apoi thenCombine functioneaza asa: asteapta ca processData1 si processData2 sa fie finalizate, apoi apeleaza functia pentru a combina datele:

.thenCombine(processData2,

(a, b)->mergeData(a,b))

Combinam astfel rezultatele celor 2 procesari si apoi scriem datele:

.thenAccept(

data->writeData(data, dest));

Aici avem de-a face cu un lant de actiuni care este de fapt un proces de business. Este ca si cum am spune: “Kathy, ia datele din arhiva si da-le mai departe catre Helen si George pentru procesare. Cnd Helen si George aduc rezultate, le dau mai departe catre Veronica pentru a le combina si pentru a le da mai departe catre Victor. Acesta urmeaza sa scrie un raport bazat pe aceste date.”

Nu avem un program definitiv aici, un program despre care sa fi discutat mai devreme: exista posibilitatea de a da mai departe datele, imediat ce putem. Singurul lucru care asteapta este thenCombine. Asteapta ambele procese pentru a le completa (iar apoi combina rezultatele celor 2 procese).

CompletableFuture este o abordare faina, care ne ajuta sa construim sisteme asincrone. Intr-o urmatoare serie de articole vom discuta si despre abordarile mai complexe in operatiunile asincrone si vom revizui si operatorii din programarea reactiva.

Articolul original poate sa fie citit aici.

Vrei sa inveti sa programezi cu Java sau sa iti imbunatatesti abilitatile de programare in Java? Parcurge cursurile noastre.

Originally published at https://www.luxoft-training.ro.

--

--

No responses yet