gpt4 book ai didi

Java 11 从 8 个并行流升级引发 ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-03 11:18:17 28 4
gpt4 key购买 nike

我将我的 Spring Boot 应用程序从 Java 8 和 tomcat 8 升级到了 java 11 和 tomcat 9。除了我在列表上使用并行流的部分之外,一切似乎都运行良好。

list.addAll(items
.parallelStream()
.filter(item -> !SomeFilter.isOk(item.getId()))
.map(logic::getSubItem)
.collect(Collectors.toList()));
之前的代码部分在 Java 8 和 Tomcat 8 上运行良好,但在 Java 9 changes 之后关于如何使用 Fork/Join 加载类的公共(public)池线程返回系统类加载器作为它们的线程上下文类加载器。
我知道在后台并行流使用 ForkJoinPool 并且我创建了一个自定义 bean 类,但仍然没有被应用程序使用。很可能是因为它们可能是在这个 bean 之前创建的。
@Bean
public ForkJoinPool myForkJoinPool() {
return new ForkJoinPool(threadPoolSize, makeFactory("APP"), null, false);
}

private ForkJoinPool.ForkJoinWorkerThreadFactory makeFactory(String prefix) {
return pool -> {
final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
worker.setName(prefix + worker.getPoolIndex());
worker.setContextClassLoader(Application.class.getClassLoader());
return worker;
};
}
最后,我还尝试将它包装在我的 ForkJoinPool 实例周围,但它是异步完成的,我不想这样做。我也不想使用提交和获取,因为这意味着我必须用 try/catch 来包装我在应用程序上拥有的所有并行流,并且代码将难以阅读。
forkJoinPool.execute(() -> 
list.addAll(items
.parallelStream()
.filter(item -> !SomeFilter.isOk(item.getId()))
.map(logic::getSubItem)
.collect(Collectors.toList())));
理想情况下,我希望应用程序中使用的所有并行流都使用应用程序中的类加载器,而不是系统类加载器。
任何的想法?

最佳答案

如果可以选择使用第三方,您可以使用 Parallel Collectors图书馆:

list.addAll(items
.stream()
.filter(item -> !SomeFilter.isOk(item.getId()))
.collect(parallel(logic::getSubItem, Collectors.toList(), forkJoinPool)
.join());

关于Java 11 从 8 个并行流升级引发 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66240365/

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