Qual é o propósito de CompletableFuture completa do método?

0

Pergunta

Eu estive fazendo algumas leituras sobre CompletableFuture.

Agora eu entendo que CompletableFuture é diferente do Futuro no sentido de que ele fornece meios para a cadeia de futuros juntos, para utilizar a chamada de retorno para lidar com as Futuras do resultado, sem, na verdade, o bloqueio de código.

No entanto, não é este completo() método que eu estou tendo um tempo difícil de moldagem minha cabeça ao redor. Eu só sei que ele permite-nos concluir um futuro manualmente, mas o que é o uso para ele? Os exemplos mais comuns que encontrei para este método é o momento de fazer alguma tarefa assíncrona, podemos imediatamente retornar uma seqüência de caracteres, por exemplo. Mas qual é o ponto de fazê-lo se o valor de retorno não reflete o resultado real? Se queremos fazer algo de forma assíncrona por que nós não apenas o uso regular futuro em vez disso? O único uso que eu posso pensar é quando queremos condicionalmente cancelar um curso de futuro. Mas eu acho que eu estou faltando alguns importantes pontos-chave aqui.

1

Melhor resposta

1

completo() é equivalente à função de transformar o estágio anterior do resultado e retornando getResponse("a1=Chittagong&a2=cidade") resposta, você pode executar esse método em um thread diferente quando getResponse() métodos de resposta em seguida, thenApply() será chamado para o registo de impressão. ninguém será bloqueado se você executar o getResponse(String url) em um thread diferente.

Este exemplo mostra um cenário onde temos a impressão de um log enquanto a obtenção de respostas a partir completo();

Código

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CompletableFutureEx {

    Logger logger = Logger.getLogger(CompletableFutureEx.class.getName());

    public static void main(String[] args) {
        new CompletableFutureEx().completableFutureEx();
    }

    private void completableFutureEx() {
        var completableFuture = new CompletableFuture<String>();
        completableFuture.thenApply(response -> {
            logger.log(Level.INFO, "Response : " + response);
            return response;
        });
        
        //some long process response
        try {
            completableFuture.complete(getResponse("a1=Chittagong&a2=city"));
        } catch (Exception e) {
            completableFuture.completeExceptionally(e);
        }

        try {
            System.out.println(completableFuture.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    private String getResponse(String url) throws URISyntaxException, IOException, InterruptedException {
        var finalUrl = "http://localhost:8081/api/v1/product/add?" + url;
        //http://localhost:8081/api/v1/product/add?a1=Chittagong&a2=city
        var request = HttpRequest.newBuilder()
                .uri(new URI(finalUrl)).GET().build();
        var response = HttpClient.newHttpClient()
                .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("response body " + response.body());
        return response.body();
    }
}
2021-11-24 06:49:50

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................