Dica de Código: Programação Assíncrona com CompletableFuture no Java \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 13 Horas 

 36 Min 

 54 Seg 

   Tempo restante da oferta: 13 36 54 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Dica de Código: Programação Assíncrona com CompletableFuture no Java  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) [ Dica de código ](https://www.treinaweb.com.br/blog/categoria/dica-de-codigo) 

# Dica de Código: Programação Assíncrona com CompletableFuture no Java

 Domine a programação assíncrona com CompletableFuture no Java e impulsione o desempenho de sua aplicação. Leia agora!

 [ Cleyson Lima ](https://www.treinaweb.com.br/blog/autor/cleyson-lima) 3 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/07/DICA-CODIGO-JAVA-1.jpg)  

A programação assíncrona é um conceito crucial na construção de aplicativos modernos, onde a responsividade é fundamental. O [Java](https://www.treinaweb.com.br/blog/guia-da-linguagem-java) 8 introduziu a classe [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html), que oferece uma maneira elegante e eficiente de realizar operações assíncronas. Neste artigo, exploraremos como utilizar o `CompletableFuture` para criar código assíncrono, melhorando o desempenho e a responsividade de sua aplicação. Continuar lendo para aprender mais sobre essa poderosa ferramenta.

 [ ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/sessao-mentoria.jpg) ](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?forma=cartao)

## O Básico do CompletableFuture

O `CompletableFuture` permite que você execute tarefas em segundo plano sem bloquear a thread principal, tornando a execução de operações demoradas mais eficiente. Vamos começar com um exemplo básico:

```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class ExemploCompletableFuture {

    public static void main(String[] args) 
        throws ExecutionException, InterruptedException 
    {
        // Criando um CompletableFuture que será completado no futuro
        var futuro = CompletableFuture.supplyAsync(() -> {
            // Simulando uma operação demorada
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // Retornando um resultado
            return 42;
        });

        // Obtendo o resultado quando estiver pronto
        int resultado = futuro.get();
        System.out.println("Resultado: " + resultado); // Imprime "Resultado: 42"
    }
}

```

Neste exemplo, criamos um `CompletableFuture` que executa uma operação demorada em segundo plano e, em seguida, obtemos o resultado quando estiver pronto. Isso permite que a thread principal continue sua execução sem esperar pela conclusão da tarefa assíncrona.

## Executando Ações Após a Conclusão

O `CompletableFuture` também permite a execução de ações após a conclusão da tarefa. No exemplo a seguir, definimos uma ação que será executada quando o `CompletableFuture` estiver completo:

[  ![Java - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/java-fundamentos)

```java
import java.util.concurrent.CompletableFuture;

public class ExemploCompletableFuture {

    public static void main(String[] args) {
        // Criando um CompletableFuture que será completado no futuro
        var futuro = CompletableFuture.supplyAsync(() -> {
            // Simulando uma operação demorada
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // Retornando um resultado
            return 42;
        });

        /* 
         * Definindo uma ação a ser executada quando 
         * o CompletableFuture estiver completo 
         */
        var novoFuturo = futuro.thenAccept(resultado -> {
            System.out.println("Resultado: " + resultado); // Imprime "Resultado: 42"
        });

        // Aguardando a conclusão (isso é opcional, dependendo do contexto)
        novoFuturo.join();
    }
}

```

Nesse caso, a ação definida com `thenAccept` imprime o resultado quando a operação assíncrona estiver completa.

## Combinando Resultados de Múltiplos CompletableFuture

O `CompletableFuture` também permite a combinação de resultados de várias tarefas assíncronas. No exemplo a seguir, criamos dois `CompletableFutures` com operações assíncronas e combinamos seus resultados:

```java
import java.util.concurrent.CompletableFuture;

public class ExemploCompletableFuture {

    public static void main(String[] args) {
        // Criando dois CompletableFutures com operações assíncronas
        var futuro1 = CompletableFuture.supplyAsync(() -> 10);
        var futuro2 = CompletableFuture.supplyAsync(() -> 20);

        /* 
         * Combinando os resultados dos CompletableFutures 
         * quando ambos estiverem prontos
         */
        var resultado = futuro1
            .thenCombine(futuro2, (valor1, valor2) -> valor1 + valor2);

        // Definindo uma ação a ser executada quando o resultado estiver pronto
        resultado.thenAccept(soma -> {
            System.out.println("Soma: " + soma); // Imprime "Soma: 30"
        });

        // Aguardando a conclusão (isso é opcional, dependendo do contexto)
        resultado.join();
    }
}

```

Neste exemplo, combinamos os resultados de `futuro1` e `futuro2` usando `thenCombine`, o que nos permite realizar operações com os valores retornados por ambos.

## Transformando Resultados

O `CompletableFuture` também permite a transformação dos resultados. No exemplo a seguir, aplicamos uma transformação ao resultado de uma tarefa assíncrona:

[  ![Java - Orientação a objetos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Orientação a objetos Conhecer o curso ](https://www.treinaweb.com.br/curso/java-orientacao-a-objetos)

```java
import java.util.concurrent.CompletableFuture;

public class ExemploCompletableFuture {

    public static void main(String[] args) {
        // Criando um CompletableFuture com uma operação assíncrona
        var futuro = CompletableFuture.supplyAsync(() -> 10);

        // Aplicando uma transformação ao resultado quando estiver pronto
        var resultado = futuro.thenApply(valor -> "Resultado: " + valor);

        /* Definindo uma ação a ser executada quando 
         * o resultado transformado estiver pronto
         */
        resultado.thenAccept(mensagem -> {
            System.out.println(mensagem); // Imprime "Resultado: 10"
        });

        // Aguardando a conclusão (isso é opcional, dependendo do contexto)
        resultado.join();
    }
}

```

Neste exemplo, usamos `thenApply` para transformar o resultado de `futuro` em uma mensagem formatada.

## Tratamento de Erros

O `CompletableFuture` também permite o tratamento de erros de maneira elegante. No exemplo a seguir, lidamos com uma exceção lançada por uma tarefa assíncrona:

```java
import java.util.concurrent.CompletableFuture;

public class ExemploCompletableFuture {

    public static void main(String[] args) {
        // Criando uma CompletableFuture que irá falhar no futuro
        var futuro = CompletableFuture.supplyAsync(() -> {
            throw new RuntimeException("Erro!");
        });

        // Tratando o erro
        var futuroTratado = futuro.exceptionally(ex -> {
            System.out.println("Erro: " + ex.getMessage());
            return null;
        });

        // Aguardando o término da execução
        futuroTratado.join(); // Erro: java.lang.RuntimeException: Erro!
    }
}

```

Nesse caso, utilizamos `exceptionally` para lidar com a exceção lançada pela tarefa assíncrona, permitindo que a aplicação continue a execução, mesmo em caso de erro.

## Melhorando o Desempenho com CompletableFuture

Vamos agora explorar um exemplo prático de como o `CompletableFuture` pode ser usado para melhorar o desempenho de uma aplicação. Imagine que você precisa fazer três chamadas de API que demoram um tempo específico para responder. Se fizermos essas chamadas de forma sequencial, o tempo total será a soma dos tempos de cada chamada. No entanto, se fizermos as chamadas de forma concorrente, o tempo total será o tempo da chamada mais demorada.

[  ![Java - Collections - Parte 1](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Collections - Parte 1 Conhecer o curso ](https://www.treinaweb.com.br/curso/java-collections-parte-1)

```java
import java.util.concurrent.CompletableFuture;

public class ExemploCompletableFuture {

    // Simulando uma chamada de API que demora um tempo específico
    public static String fakeApi(long tempo) {
        try {
            Thread.sleep(tempo);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "OK";
    }

    public static void sequencial() {
        // Chamando a API de forma sequencial
        var inicio = System.currentTimeMillis();
        fakeApi(1000);
        fakeApi(2000);
        fakeApi(1500);
        var fim = System.currentTimeMillis();
        System.out.println("Tempo total: " + (fim - inicio));
    }

    public static void concorrente() {
        // Chamando a API de forma concorrente
        var inicio = System.currentTimeMillis();
        var futuro1 = CompletableFuture.supplyAsync(() -> fakeApi(1000));
        var futuro2 = CompletableFuture.supplyAsync(() -> fakeApi(2000));
        var futuro3 = CompletableFuture.supplyAsync(() -> fakeApi(1500));

        /*
         * Podemos usar o método CompletableFuture.allOf() para aguardar o término de
         * todas as chamadas.
         */
        CompletableFuture.allOf(futuro1, futuro2, futuro3).join();
        var fim = System.currentTimeMillis();
        System.out.println("Tempo total: " + (fim - inicio));
    }

    public static void main(String[] args) {
        sequencial(); // Imprime "Tempo total: 4501"
        concorrente(); // Imprime "Tempo total: 2005"
    }
}

```

Neste exemplo, comparamos a execução sequencial das chamadas de API com a execução concorrente usando `CompletableFuture`. O resultado demonstra como a programação assíncrona pode melhorar significativamente o desempenho da aplicação.

## Conclusão

O `CompletableFuture` é uma ferramenta poderosa para lidar com programação assíncrona no Java. Com ele, você pode executar tarefas em segundo plano, combinar resultados, transformar dados e lidar com erros de forma eficiente. Além disso, o uso do `CompletableFuture` pode melhorar o desempenho de sua aplicação, tornando-a mais responsiva e eficaz. Portanto, considere incorporar o `CompletableFuture` em seus projetos para obter benefícios significativos na programação assíncrona.

[  ![Java - Stream API](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Stream API Conhecer o curso ](https://www.treinaweb.com.br/curso/java-stream-api)

Esperamos que este artigo tenha fornecido uma compreensão sólida do `CompletableFuture` e como usá-lo em sua jornada de programação assíncrona no Java. Se você quiser saber mais, não hesite em explorar a documentação oficial do Java e experimentar com exemplos adicionais. O futuro da programação assíncrona no Java está repleto de oportunidades emocionantes!

- [ #Java ](https://www.treinaweb.com.br/blog/tag/java)
- [ #dica de código ](https://www.treinaweb.com.br/blog/tag/dica-de-codigo)
- [ #dica de código java ](https://www.treinaweb.com.br/blog/tag/dica-de-codigo-java)
- [ #completablefuture ](https://www.treinaweb.com.br/blog/tag/completablefuture)

Autor

 ![Cleyson Lima](//secure.gravatar.com/avatar/db30efb102ffa5d5204cebe12060b111?d=mm)

## Cleyson Lima

 Professor, programador, fã de One Piece e finge saber cozinhar. Cleyson é graduando em Licenciatura em Informática pelo IFPI - Campus Teresina Zona Sul, nos anos de 2019 e 2020 esteve envolvido em vários projetos coordenados pela secretaria municipal de educação da cidade de Teresina, onde o foco era introduzir alunos da rede pública no mundo da programação e robótica. Hoje é instrutor dos cursos de Spring na TreinaWeb, mas diz que seu coração sempre pertencerá ao Python. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/cleyson-lima)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/07/DICA-CODIGO-JAVA-1-400x280.jpg)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     3 anos atrás

    ##  [ Dica de Código: Principais coleções do Java ](https://www.treinaweb.com.br/blog/dica-de-codigo-principais-colecoes-do-java) 

     Explore as poderosas ferramentas do Java Collections Framework: List, Set e Map. Domine a manipulação de dados com eficiência!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/07/DICA-CODIGO-PHP-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     3 anos atrás

    ##  [ Dica de Código: Enums no PHP ](https://www.treinaweb.com.br/blog/dica-de-codigo-enums-no-php) 

     Descubra como os enums no PHP podem transformar seu código, tornando-o mais claro e eficiente. Otimize seu código agora!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/07/DICA-CODIGO-TS-400x280.jpg)  [ Dica de código ](https://www.treinaweb.com.br/blog/categoria/dica-de-codigo) 

     3 anos atrás

    ##  [ Dica de Código: Métodos para trabalhar com arrays em TypeScript ](https://www.treinaweb.com.br/blog/dica-de-codigo-metodos-para-trabalhar-com-arrays-em-typescript) 

     Desvende os segredos dos arrays em JavaScript! Aprenda métodos poderosos para manipulação eficiente. Torne-se um mestre na arte do desenvolvimento.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/temas-wordpress-400x280.jpg)  [ WordPress ](https://www.treinaweb.com.br/blog/categoria/wordpress) 

     10 anos atrás

    ##  [ Personalizar temas Wordpress sem alterar o código-fonte ](https://www.treinaweb.com.br/blog/personalizar-temas-wordpress-sem-alterar-o-codigo-fonte) 

     O Wordpress é o CMS mais usado do mundo. Veja algumas dicas sobre como personalizar seu site/blog utilizando temas premium.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/instalacao-do-vs-code-no-windows-linux-e-macos-400x280.png)  [ Ferramentas ](https://www.treinaweb.com.br/blog/categoria/ferramentas) 

     6 anos atrás

    ##  [ VS Code - O que é e por que você deve usar? ](https://www.treinaweb.com.br/blog/vs-code-o-que-e-e-por-que-voce-deve-usar) 

     O VS Code é um dos editores de código mais utilizados no mundo. Conheça melhor essa ferramenta e entenda o motivo de sua popularidade.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/08/dicas-programadores-iniciantes-parte-2-1-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     5 anos atrás

    ##  [ Dicas para programadores iniciantes - parte 2 ](https://www.treinaweb.com.br/blog/dicas-para-programadores-iniciantes-parte-2) 

     Receber dicas nunca é demais. Confira neste artigo algumas dicas que podem fazer a diferença no seu começo de carreira.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/dicas-programadores-iniciantes-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     6 anos atrás

    ##  [ Dicas para programadores iniciantes ](https://www.treinaweb.com.br/blog/dicas-para-programadores-iniciantes) 

     Confira neste artigo algumas dicas para programadores iniciantes, que tem a finalidade de ajudá-los a trilhar seus caminhos nessa área.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/11/06145813/react-16-400x280.jpg)  [ Padrões de Projeto ](https://www.treinaweb.com.br/blog/categoria/padroes-de-projeto) 

     4 anos atrás

    ##  [ Boas práticas para o React ](https://www.treinaweb.com.br/blog/boas-praticas-para-o-react) 

     Veja neste artigo algumas das dicas e boas práticas para utilizar em uma aplicação React e tenha um código mais limpo na sua aplicação.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/javascript-comandos-do-console-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     5 anos atrás

    ##  [ Trabalhando com data no JavaScript ](https://www.treinaweb.com.br/blog/trabalhando-com-data-no-javascript) 

     Neste artigo veremos como manipular datas no JavaScript, utilizando a classe Date, como pegar a data atual e utilizar os métodos da classe.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/08152320/melhorar-perfil-desenvolvedor-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     8 anos atrás

    ##  [ Como melhorar seu perfil online de desenvolvedor ](https://www.treinaweb.com.br/blog/como-melhorar-seu-perfil-online-de-desenvolvedor) 

     Veja neste artigo como melhorar seu perfil online para conseguir o "emprego dos sonhos".

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/02/21162610/capa-400x280.jpg)  [ Desenvolvimento de Jogos ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-de-jogos) 

     9 anos atrás

    ##  [ Como se tornar um desenvolvedor de games? ](https://www.treinaweb.com.br/blog/como-se-tornar-um-desenvolvedor-de-games) 

     Veja nesse artigo como dar o primeiro passo na sua carreira de desenvolvimento de games.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/COMO-SE-PREPARAR-PARA-ENTREVISTA-TECNICA-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     4 anos atrás

    ##  [ Como se preparar para entrevistas técnicas ](https://www.treinaweb.com.br/blog/como-se-preparar-para-entrevistas-tecnicas) 

     Geralmente, quando participamos de um processo seletivo para uma vaga relacionada a desenvolvimento, há uma etapa técnica, onde os entrevistadores irão avaliar suas competências técnicas, sua linha de raciocínio lógico e a maneira como você emprega ferramentas e tecnologias para a resolução de problemas. Neste artigo, separamos algumas dicas para que você possa se sair bem nesta etapa.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **13h 36min 54s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
