叉连接池悬挂

别名:

这种情况是应用程序不时无限地挂起。

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

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-1执行代码的线程冻结在get()

"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()

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

更新。parallelism设置为大于1的值时,未检测到任何问题。

别名:

设置parallelism = N在那里N > 1解决了这个问题。

奇怪的事情,但似乎有一些错误,ForkJoinPool类似于这里所说的

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章