Fork Join висит у бассейна - PullRequest
       32

Fork Join висит у бассейна

0 голосов
/ 28 апреля 2018

Дело в том, что приложение время от времени зависает бесконечно.

Кажется, что ошибка находится в следующем фрагменте:

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, проблем не обнаружено.

1 Ответ

0 голосов
/ 06 июля 2018

Установить parallelism = N, где N > 1 решить проблему.

Странно, но кажется, что в ForkJoinPool есть какая-то ошибка, похожая на ту, что указана здесь .

...