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:
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:
Tratamento de exceções de CompletableFuture
Considere a figura a seguir, que representa os cinco CFs:
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.
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);