На моем windows компьютере у меня 6 ядер.
Я создаю поток из 24 элементов и выполняю операцию над каждым элементом, используя операцию карты в Stream API. Я использую параллелизм:
myCollection.parallelStream()
.map(element -> someTimeConsumingOperation(element)
.collect(toList());
someTimeConsumingOperation имитирует длительную операцию, используя:
Thread.sleep(2000);
myCollection имеет 24 элемента. Я понимаю, что потоки используют исполнителя ForkJoinPool по умолчанию для параллельного выполнения операций, который, в свою очередь, учитывает количество ядер, чтобы определить, сколько потоков должно быть в пуле. Создано 6 потоков. Если это так, и каждая операция занимает почти 2 секунды, вся обработка потока должна занять около 8 секунд (каждый поток будет выполнять 4 операции, так как у нас есть 24 элемента для обработки, следовательно, 4 * 2 секунды).
Но я заметил, что обработка занимает всего 4 секунды.