以下是我尝试使用“可完成未来”类实现的用例
我尝试了以下代码,但它不能正常工作
// list content
List<Integer> ids = Arrays.asList(1,2,3,4,5);
// Api call using parallel stream - not sure how I can include a time limit here so that
// I can get partial list of updatedIds based on delay settings
List<Integer> updatedIds = ids.parallelStream().map(item -> {
// api call equivalent of increment 1
return item+1;
}).collect(Collectors.toList());
// Asynchronous api call using CompletableFuture class - not sure how I can
// dynamically call the function for all items in the ids list.
// Following is what I tried to do by reading
// https://www.baeldung.com/java-completablefuture
encounterIdSet.parallelStream().forEach(id -> {
CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> serviceCall(id));
});
List<Integer> = completableFuture.get(60, TimeUnit.SECONDS); // may be in incorrect location
// I want to process the list of returned integers here - whatever I am getting in 60 seconds timeout mentioned in timeout settings
// service call definition
Integer serviceCall(id){
return id +1;
}
您能指导我这个用例吗?我需要 1.超时设置为 2。异步数据处理 3.未知的项目数。
我正在使用Java 8。
谢谢。
我可以想到两种方式,但有一些细微的区别:
List<CompletableFuture<Integer>> futures = ids.stream()
.map(id -> CompletableFuture.supplyAsync(() -> id + 1))
.collect(Collectors.toList());
try {
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get(60, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
// log
}
List<Integer> result = futures
.stream()
.filter(future -> future.isDone() && !future.isCompletedExceptionally())
.map(CompletableFuture::join)
.collect(Collectors.toList());
或者
List<Integer> result = ids.stream()
.map(id -> CompletableFuture.supplyAsync(() -> id + 1))
.map(cf -> {
try {
return cf.get(60, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
// log
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
我的应用程序严重依赖异步Web服务。它是用spring boot 1.5.x构建的,它允许我使用标准的Java8来生成延迟的异步响应。更多信息请参见https://nickebbitt.github.io/blog/2017/03/22/async-web-service-using-completable-future Spring Boot2.0.x现在附带了可以利用反应范例的入门包。Spri
本文向大家介绍Java8新的异步编程方式CompletableFuture实现,包括了Java8新的异步编程方式CompletableFuture实现的使用技巧和注意事项,需要的朋友参考一下 一. Future JDK 5引入了Future模式。Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算。 Future模式是多线程设计
我有一个Spring Boot服务,其中包含一些用于并行异步调用的代码,如下所示: CompletableFuture future1=accountManager。getResult(url1); CompletableFuture future2=accountManager。getResult(url2); 复杂的Future.allOf(未来1,未来2)。 字符串result1=futur
我(大部分)了解CompletableFuture的三种执行方法: 非异步(同步执行) 默认异步(使用默认执行器异步) 自定义异步(使用自定义执行器异步) 我的问题是:什么时候应该支持使用非异步方法? 如果您有一个调用其他方法的代码块,该代码块也返回CompletableFuture,会发生什么?表面上看,这可能很便宜,但如果这些方法也使用非异步调用,会发生什么?这难道不是一个很长的非异步块,可能
主要内容:1.业务问题,2.CompletableFuture介绍,3.创建异步对象,4.计算完成时回调方法,5.线程串行化与并行化方法,6.多任务组合,7.优化商品详情页1.业务问题 询商品详情页的逻辑非常复杂,数据的获取都需要远程调用,必然需要花费更多的时间。 假如商品详情页的每个查询,需要如下标注的时间才能完成 获取sku的基本信息 1.5s 获取sku的图片信息 0.5s 获取spu的所有销售属性 1s sku价格 1.5s 那么,用户需要4.5s后才能看到商品详情页的内容。很显然是不能
主要内容:1.业务问题,2.CompletableFuture介绍,3.创建异步对象,4.计算完成时回调方法,5.线程串行化与并行化方法,6.多任务组合,7.优化商品详情页1.业务问题 询商品详情页的逻辑非常复杂,数据的获取都需要远程调用,必然需要花费更多的时间。 假如商品详情页的每个查询,需要如下标注的时间才能完成 获取sku的基本信息 1.5s 获取sku的图片信息 0.5s 获取spu的所有销售属性 1s sku价格 1.5s 那么,用户需要4.5s后才能看到商品详情页的内容。很显然是不能