Какова цель полного метода CompletableFuture?

0

Вопрос

Я кое-что читал о CompletableFuture.

На данный момент я понимаю, что CompletableFuture отличается от Future в том смысле, что он предоставляет средства для объединения фьючерсов в цепочку, чтобы использовать обратный вызов для обработки результата Будущего, фактически не блокируя код.

Тем не менее, существует этот полный() метод, который мне трудно понять. Я знаю только, что это позволяет нам завершить будущее вручную, но как это использовать? Наиболее распространенные примеры, которые я нашел для этого метода, - это когда мы выполняем какую-либо асинхронную задачу, например, мы можем немедленно вернуть строку. Но какой в этом смысл, если возвращаемое значение не отражает фактический результат? Если мы хотим что-то делать асинхронно, почему бы нам просто не использовать обычное будущее вместо этого? Единственное применение, которое я могу придумать, - это когда мы хотим условно отменить текущее будущее. Но я думаю, что упускаю здесь некоторые важные ключевые моменты.

1

Лучший ответ

1

функция complete() эквивалентна функции, преобразующей результат предыдущего этапа и возвращающей GetResponse("a1=Читтагонг и a2=город"). ответ, вы можете запустить этот метод в другом потоке , когда будет доступен ответ методов GetResponse (), тогда для печати журнала будет вызвана функция thenApply (). никто не будет заблокирован, если вы запустите GetResponse(строковый URL-адрес) в другом потоке.

В этом примере показан сценарий, в котором мы печатаем журнал, получая ответы от complete();

Код

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

На других языках

Эта страница на других языках

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