Дело в том, что приложение время от времени зависает бесконечно.
Кажется, что ошибка находится в следующем фрагменте:
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
, но все еще заинтересован в корне проблемы.
Обновление. Когда для parallelism
установлено значение больше 1, проблем не обнаружено.