gpt4 book ai didi

rest - AsyncResponse 和 Java 8 并行流问题

转载 作者:行者123 更新时间:2023-12-01 06:48:52 26 4
gpt4 key购买 nike

我正在使用带有 Jersey rest api 的 spring boot

@POST
@Path("test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public void test(final List<String> requests, @Suspended final AsyncResponse asyncResponse) {

List<String> resplist = new ArrayList();
requests.parallelStream().forEach(req -> {

String resp = //some process to get (Always return string)
resplist.add(resp);
});

asyncResponse.resume(resplist);

}

如果我使用 parallelStream,有时在客户端检索到的列表不会返回所有元素。

假设我传递 30 它返回 29 但有时它返回 30(请求总是相同的)

但如果我仅将普通流与 forEach 一起使用,那么它总是会返回 30 个元素。

这是某种错误吗?我可以不在 rest api 中使用 parallelStream

更新

正如 Eugene 所回答的那样,这是问题所在,因为当使用并行流时,多个线程将记录添加到 arraylist 中,这不是线程安全的

解决方案使用同步采集

Collection<String> resplist = Collections.synchronizedCollection(new ArrayList<String>());

最佳答案

据我所知,您在这部分依赖于副作用:

.forEach(req -> {

String resp = //some process to get (Always return string)
resplist.add(resp);
});

您正在生成多个线程以将元素添加到非线程安全的集合中,例如 ArrayList

您应该改为通过 .collect(Collectors.toList()) 收集它们

关于rest - AsyncResponse 和 Java 8 并行流问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com