#ForkJoinPool #FixedThreadPool #parallelStream #stream
Оказывается работая в параллельной зоне кода в рамках потоков обычного FixedThreadPool при поднятии parallelStream(), например по коллекции, он создаст внутри стрима ещё один ForkJoinPool - и в результате может быть полная каша.
К примеру, если же параллельный стрим стартует внутри потока типа fork join, то такой путаницы из потоков не происходит, потому что при старте параллельного стрима он поймет по типу потока, что уже находится внутри ForkJoinPool и стрим будет работать как обычный последовательный для каждого потока.
На скрине в отладке показана плохая ситуация и видны обычные (не fork join) параллельные потоки, которые пришли в стрим и создали в этом месте fork join потоки по количеству доступных ядер для элементов коллекции.
Вот так.
Эти два типа потоков не "узнают" друг друга в параллельных стримах.
Типа "эй товарищ, ты создаёшь параллельный стрим внутри многопоточности и нечего городить ещё одну многопоточность в себе".
Оказывается работая в параллельной зоне кода в рамках потоков обычного FixedThreadPool при поднятии parallelStream(), например по коллекции, он создаст внутри стрима ещё один ForkJoinPool - и в результате может быть полная каша.
К примеру, если же параллельный стрим стартует внутри потока типа fork join, то такой путаницы из потоков не происходит, потому что при старте параллельного стрима он поймет по типу потока, что уже находится внутри ForkJoinPool и стрим будет работать как обычный последовательный для каждого потока.
На скрине в отладке показана плохая ситуация и видны обычные (не fork join) параллельные потоки, которые пришли в стрим и создали в этом месте fork join потоки по количеству доступных ядер для элементов коллекции.
Вот так.
Эти два типа потоков не "узнают" друг друга в параллельных стримах.
Типа "эй товарищ, ты создаёшь параллельный стрим внутри многопоточности и нечего городить ещё одну многопоточность в себе".
❤1🤯1