используя CompletionStage вместо CompletableFuture - PullRequest
0 голосов
/ 25 сентября 2018

с учетом следующего метода:

private static String getChuckNorrisJoke () {
    try {
        HttpURLConnection con = (HttpURLConnection) new
        URL( "http://api.icndb.com/jokes/random" ).openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = in.readLine()) != null ) {
            response.append(line);
        }
        in.close();
        return response.toString();
    } catch (IOException e) {
        throw new IllegalStateException( "Something is wrong: " , e);
    }
}

следующий оператор может использоваться для асинхронного запуска метода.

final CompletableFuture<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());

хотя я думаю, что понимаю CompletionStageОтносительно CompletableFuture, я не уверен, как я могу использовать CompletionStage для выполнения той же задачи.

final CompletionStage<String> jokeAsync = ?

также я не уверен насчет «этапов объединения»

1 Ответ

0 голосов
/ 25 сентября 2018

CompletionStage - это интерфейс, реализованный CompletableFuture, поэтому вы можете просто объявить jokeAsync как CompletionStage, и он будет работать:

final CompletionStage<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());

Если у вас есть несколько этапов, вы можетеобъединить их по-разному, например:

  • thenCombine(), чтобы объединить результат двух этапов
  • applyToEither() для обработкирезультат первого, который завершает и возвращает новый этап с результатом
  • acceptEither() для использования результата любого из них без возврата нового результата
  • runAfterBoth() и runAfterEither() для запуска операции после завершения обоих этапов или любого из этих этапов.

API CompletionStage не предлагает некоторые операции, которыепредоставляется только CompletableFuture:

  • отправкой задач, например, с supplyAsync()
  • , объединяющим множество этапов с allOf() и anyOf()
  • программно завершающими этапамиили создание уже завершенных этапов
  • в ожидании результата этапа с join() или get()

Но toCompletableFuture() позволяет преобразовать любую ступень и таким образом сократить разрыв.

...