我在 JDK 1.8.0_40 中使用 ForkJoinPool 时遇到了一个奇怪的问题,而只需恢复到 1.8.0 即可解决问题,而无需更改任何代码。
该代码采用一个可运行的列表,使用 ForkJoinTask.adapt() 将它们转换为 ForkJoinTask 列表。对于每个列表,我使用一个封闭的 ForkJoinTask,它在 exec() 方法的列表中调用 ForkJoinTask.invokeAll()。(https://github.com/mich8bsp/forkjoinpool-reproducer)
我看到的问题是,偶尔调用这个 ForkJoinTask 会无限期地阻塞。我确实看到其他线程正在运行,但是称为“调用”的线程被卡住了。
对比 jdk 1.8.0 和 1.8.0_40 的源码我看到 ForkJoinPool.java 和 ForkJoinTask.java 有很多变化
是否有任何关于此更改的文档?任何导致可能导致问题的原因?
(我使用的 JVM 版本是 Java Hotspot 64-Bit Server VM build 25.40-b25)
编辑:也许这种变化是原因?https://bugs.java.com/view_bug.do?bug_id=8056248