Fork Join 池挂起
Fork Join pool hangs
案例是应用程序不时无限挂起。
似乎错误位于以下代码段中:
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()
中等待?
P.S.我知道不建议在ForkJoinPool
执行I/O-related任务,但还是对root感兴趣问题。
更新。当parallelism
设置为大于1的值时,没有检测到问题。
设置 parallelism = N
其中 N > 1
解决了问题。
奇怪的是,ForkJoinPool
中似乎存在一些与 here.
中所述类似的错误
案例是应用程序不时无限挂起。
似乎错误位于以下代码段中:
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()
中等待?
P.S.我知道不建议在ForkJoinPool
执行I/O-related任务,但还是对root感兴趣问题。
更新。当parallelism
设置为大于1的值时,没有检测到问题。
设置 parallelism = N
其中 N > 1
解决了问题。
奇怪的是,ForkJoinPool
中似乎存在一些与 here.