logo

O que é CompletableFuture?

A CompltableFuturo é usado para programação assíncrona. Programação assíncrona significa escrever código sem bloqueio. Ele executa uma tarefa em um thread separado do thread principal do aplicativo e notifica o thread principal sobre seu progresso, conclusão ou falha.

Dessa forma, o thread principal não bloqueia nem aguarda a conclusão da tarefa. Outras tarefas são executadas em paralelo. O paralelismo melhora o desempenho do programa.

Um CompletableFuture é uma classe em Java. Pertence ao pacote java.util.cocurrent. Ele implementa as interfaces CompletionStage e Future.

Estágio de conclusão

  • Ele executa uma ação e retorna um valor quando outro estágio de conclusão é concluído.
  • Um modelo para uma tarefa que pode desencadear outras tarefas.

Portanto, é um elemento de uma cadeia.

Quando mais de um thread tenta ser concluído - complete excepcionalmente ou cancele um CompletableFuture, apenas um deles é bem-sucedido.

inteiro comparar com java

Futuro vs. Futuro Completável

Um CompletableFuture é uma extensão da API Future do Java que foi introduzida no Java 8.

Um Future é usado para programação assíncrona. Ele fornece dois métodos, isDone() e get(). Os métodos recuperam o resultado do cálculo quando ele é concluído.

Limitações do Futuro

  • Um futuro não pode ser mutuamente completo.
  • Não podemos realizar outras ações sobre o resultado de um Futuro sem bloquear.
  • Future não tem nenhum tratamento de exceção.
  • Não podemos combinar múltiplos futuros.

Future tem tantas limitações, é por isso que temos CompletableFuture. CompletableFuture fornece um amplo conjunto de métodos para criar vários futuros, encadear e combinar. Ele também possui suporte abrangente ao tratamento de exceções.

Criando um Futuro Completável

Podemos criar um CompletableFuture apenas usando o seguinte construtor sem argumentos.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Exemplo

Os métodos CompletableFuture usados ​​com mais frequência são:

    fornecerAsync():Ele completa seu trabalho de forma assíncrona. O resultado do fornecedor é executado por uma tarefa de ForkJoinPool.commonPool() como padrão. O método supplyAsync() retorna CompletableFuture no qual podemos aplicar outros métodos.entãoAplicar():O método aceita função como argumento. Ele retorna um novo CompletableStage quando este estágio é concluído normalmente. O novo estágio é usado como argumento para a função fornecida.juntar():o método retorna o valor do resultado quando concluído. Ele também lança uma CompletionException (exceção não verificada) se for concluída excepcionalmente.
 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; } } 

Saída:

CompletableFuturo em Java

Tratamento de exceções de CompletableFuture

Considere a figura a seguir, que representa os cinco CFs:

CompletableFuturo em Java

Suponha que cinco CFs em execução e CF21 gere uma exceção, então todos os CFs dependentes (CF31 e CF41) estão errados. Significa que:

pontos de primavera
  • A chamada ao método isCompletedExceptionally() retorna verdadeiro.
  • A chamada para get() lança uma ExecutionException que causa a exceção raiz.

Considere a figura a seguir, na qual criamos o CF30 com uma exceção.

CompletableFuturo em Java

Quando o CF21 executa normalmente, o CF30 apenas transmite o valor. Se gerar uma exceção, o CF30 trata disso e gera valor para CF31.

Existem três métodos para lidar com uma exceção:

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