栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

清单 走向未来 序列

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

清单 走向未来 序列

用途

CompletableFuture.allOf(...)

static<T> CompletableFuture<List<T>> sequence(List<CompletableFuture<T>> com) {    return CompletableFuture.allOf(com.toArray(new CompletableFuture<?>[0])) .thenApply(v -> com.stream()     .map(CompletableFuture::join)     .collect(Collectors.toList()) );}

关于您的实现的一些评论:

您使用的

.thenComposeAsync
.thenApplyAsync
并且
.thenCombineAsync
很可能没有做你的期望。这些
...Async
方法在单独的线程中运行提供给它们的函数。因此,在您的情况下,您导致将新项添加到列表中以在提供的执行程序中运行。无需将轻量级操作填充到缓存的线程执行器中。请勿在
thenXXXXAsync
无充分理由的情况下使用方法。

另外,

reduce
不应用于堆积到易变容器中。即使在流是顺序的流时它可能正确工作,但是如果将流设为并行流,它将失败。要执行可变减少,请
.collect
改用。

如果要在第一次失败后立即异常完成整个计算,请在您的

sequence
方法中执行以下操作:

CompletableFuture<List<T>> result = CompletableFuture.allOf(com.toArray(new CompletableFuture<?>[0]))        .thenApply(v -> com.stream()     .map(CompletableFuture::join)     .collect(Collectors.toList())        );com.forEach(f -> f.whenComplete((t, ex) -> {    if (ex != null) {        result.completeExceptionally(ex);    }}));return result;

此外,如果您想在第一次失败时取消其余操作,请在

exec.shutdownNow();
之后添加
result.completeExceptionally(ex);
。当然,这假定
exec
仅针对这一计算存在。如果没有,则必须循环遍历并分别取消剩余的
Future
每个。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号