使用以下方法:
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 = ?
另外,我不确定“合并阶段”
答案 0 :(得分:1)
CompletionStage
是由CompletableFuture
实现的接口,因此您只需将jokeAsync
声明为CompletionStage
,它将起作用:
final CompletionStage<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());
如果您有多个阶段,则可以用不同的方式将它们组合在一起,例如:
thenCombine()
合并两个阶段的结果applyToEither()
处理第一个完成的结果并返回带有结果的新阶段acceptEither()
使用任何一个的结果而不返回新结果runAfterBoth()
和runAfterEither()
在两个阶段或两个阶段均完成后运行操作。 CompletionStage
API不提供某些仅由CompletableFuture
提供的操作:
supplyAsync()
allOf()
和anyOf()
组合起来join()
或get()
的阶段结果但是toCompletableFuture()
允许转换任何阶段,从而缩小差距。