Jaki jest cel pełnego metody CompletableFuture?

0

Pytanie

Ja coś czytałem o CompletableFuture.

W tej chwili rozumiem, że CompletableFuture różni się od Future w tym sensie, że zapewnia środki do łączenia kontraktów terminowych w łańcuch, aby korzystać z oddzwanianie do obróbki wyników w Przyszłości, w rzeczywistości nie blokuje kod.

Jednakże, nie jest to pełna() metoda, którą trudno mi zrozumieć. Wiem tylko, że to pozwala nam zakończyć przyszłość ręcznie, ale jak to użyć? Najbardziej typowe przykłady, które znalazłem do tej metody, to kiedy wykonujemy jakąś asynchroniczne zadanie, na przykład, możemy natychmiast zwrócić wiersz. Ale jaki w tym sens, jeśli zwrócona wartość nie odzwierciedla rzeczywisty wynik? Jeśli chcemy coś zrobić asynchronicznie, dlaczego po prostu nie użyć zwykłych przyszłość zamiast tego? Jedyne zastosowanie, które mogę wymyślić, to gdy chcemy warunkowo anulować bieżące przyszłość. Ale myślę, że nie dostrzegam tu pewne ważne słowa chwile.

1

Najlepsza odpowiedź

1

funkcja complete() jest odpowiednikiem funkcji, przekształcające wynik z poprzedniego etapu i zwracającej GetResponse("a1=Читтагонг i a2=miasto"). odpowiedź, można uruchomić ten metoda w innym wątku kiedy będzie dostępny odpowiedzi technik GetResponse (), wtedy do drukowania dziennika zostanie wywołana funkcja thenApply (). nikt nie zostanie zablokowany, jeśli uruchom GetResponse(string URL) w innym wątku.

W tym przykładzie pokazano scenariusz, w którym drukujemy magazyn, uzyskując odpowiedzi od complete();

Kod

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

W innych językach

Ta strona jest w innych językach

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