Реалізація Oracle [1] паралельного потоку використовує поточний потік, а крім цього, за потреби, також і потоки, що складають пул приєднання форків ForkJoinPool.commonPool()
за замовчуванням, розмір якого за замовчуванням дорівнює одному, меншому за кількість ядер вашого процесора .
Розмір загального пулу за замовчуванням можна змінити за допомогою цієї властивості:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=8
Крім того, ви можете використовувати власний пул:
ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
list.parallelStream().forEach();
).get();
Що стосується замовлення, завдання будуть виконуватися, як тільки буде доступний потік, без певного порядку.
Як правильно зазначив @Holger, це деталь, що стосується реалізації (лише з одним нечітким посиланням внизу документа), обидва підходи працюватимуть на JVM Oracle, але точно не гарантовано працюватимуть на JVM від інших постачальників, властивість може не існують у реалізації, яка не входить до складу Oracle, і Streams не може навіть використовувати ForkJoinPool
внутрішній візуалізаційний варіант, заснований на поведінці ForkJoinTask.fork
абсолютно марних ( див. тут для деталей про це).