JDK17中ForkJoinPool调用Arrays.parallelSort出现挂起问题求助
问题:自定义ForkJoinPool中调用Arrays.parallelSort在JDK17中挂起
在4/8核笔记本上,使用-ea命令行参数运行以下代码时,JDK16下可稳定正常执行,但JDK17下会稳定出现挂起情况。已提交JDK工单,但关于该用法是否合规存在分歧,且近半年无更新。恳请帮忙排查是否存在用法错误,并提供修复方案:
import java.util.Arrays; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.stream.Stream; import org.junit.Test; public class FjpTest { @Test public void testFjp() { final ForkJoinPool fjPool = new ForkJoinPool(1); final String[] objs = Stream.generate(() -> "").limit(10_000).toArray(String[]::new); // 下面这行本该排序数组,却导致单线程自旋等待 fjPool.invoke(ForkJoinTask.adapt(() -> Arrays.parallelSort(objs))); // 这里挂起了! } }
更新1:
考虑以下自定义线程池中执行大量业务逻辑的场景。这不仅是功能上的严重退化(因此JDK工单优先级为P3)——毕竟它在JDK16中能正常工作;还暴露了JDK17的内部兼容性问题:我们似乎无法再将自定义ForkJoinPool与集合框架的并行API配合使用。我仍不确定该如何解决,能想到的唯一办法是把原本设计为在公共线程池运行的任务显式提交到公共线程池,但这是个过于严苛的设计选择。我是不是忽略了什么?
new ForkJoinPool(1).invoke(ForkJoinTask.adapt(() -> { // ... 大型应用中的复杂核心业务逻辑,运行在自定义ForkJoinPool中 // 此时若开发者(甚至没意识到当前在自定义线程池中)或依赖库调用了集合框架的并行方法... Arrays.parallelSort(Stream.generate(() -> "").limit(10_000).toArray(String[]::new)); // ... 从此处开始的代码都无法执行了 ... }));
内容的提问来源于stack exchange,提问作者Uwe
相关产品推荐
相关产品推荐

