Care este scopul CompletableFuture completă metodă?

0

Problema

Am citit ceva despre CompletableFuture.

Ca de acum, am înțeles că CompletableFuture este diferit de Viitor, în sensul că oferă mijloacele de a lanțului de viitorul împreună, de a utiliza callback să se ocupe de Viitorul duce de fapt, fără blocarea codului.

Cu toate acestea, nu este completă() metodă care sunt având un timp de greu să ma obișnuiesc. Știu doar că ne permite să completați un viitor manual, dar ceea ce este utilizarea de ea? Cele mai comune exemple am găsit pentru această metodă este atunci când faci ceva asincron sarcina, ne putem întoarce imediat un șir de exemplu. Dar ceea ce este punctul de a face astfel încât dacă valoarea returnată nu reflectă rezultatul efectiv? Dacă vrem să facem ceva asincron de ce nu folosim regulat viitor în loc? Numai utilizarea mă pot gândi este atunci când vrem să condiționat anula un curs viitor. Dar cred că îmi lipsesc niște importante puncte cheie aici.

1

Cel mai bun răspuns

1

completați() este echivalentă cu funcția transformarea etapa anterioară este rezultatul și se întorc getResponse("a1=Chittagong&a2=city") ca răspuns, puteți rula această metodă într-un alt thread când getResponse() metode de răspuns disponibile atunci thenApply() va fi invocat pentru imprimare jurnal. nimeni nu va fi blocat, dacă tu a alerga getResponse(String url) într-un fir diferit.

Acest exemplu arată un scenariu în cazul în care suntem imprimarea unui jurnal în timp ce obținerea de răspunsuri de la complet();

Cod

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

În alte limbi

Această pagină este în alte limbi

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