gpt4 book ai didi

java - Fork Join 池挂起

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:19 26 4
gpt4 key购买 nike

情况是应用程序有时会无限挂起。

该错误似乎位于以下代码片段中:

ForkJoinPool pool = new ForkJoinPool(1); // parallelism = 1

List<String> entries = ...;

pool.submit(() -> {

entries.stream().parallel().forEach(entry -> {
// An I/O op.
...
});

}).get();

执行代码的线程pool-4-thread-1get()上卡住:

"pool-4-thread-1" #35 prio=5 os_prio=0 tid=0x00002b42e4013800 nid=0xb7d1 in Object.wait() [0x00002b427b72f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.util.concurrent.ForkJoinTask.externalInterruptibleAwaitDone(ForkJoinTask.java:367)
- locked <0x00000000e08b68b8> (a java.util.concurrent.ForkJoinTask$AdaptedRunnableAction)
at java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1001)
...other app methods

可以假设传递给 submit() 的任务执行时间太长。

但令人惊讶的是,线程转储中没有出现 ForkJoinPool-N-worker-N ,因此看起来池没有执行任何计算!

这怎么可能?如果池中没有执行任何任务,为什么 pool-4-thread-1 线程在 get() 内等待?

P.S.我知道不建议在ForkJoinPool中执行与I/O相关的任务,但仍然对问题的根源感兴趣。

更新。并行度设置为大于1的值时,不会检测到任何问题。

最佳答案

设置parallelism = N,其中N > 1解决了问题。

奇怪的是,ForkJoinPool 中似乎存在一些类似于所述的错误 here .

关于java - Fork Join 池挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50077315/

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