Java-потоки основывают объем параллелизма на вашем оборудовании. Но что, если я хочу всегда иметь максимальный объем параллелизма?Максимизировать параллелизм с потоками Java 8
Рассмотрите приведенный ниже код. Я хочу, чтобы каждая из 10 задач выполнялась одновременно в течение 100 миллисекунд.
long runUntil = System.currentTimeMillis() + 100;
IntStream.range(0, 10).parallel().forEach(i ->
{
int cnt = 0;
while(System.currentTimeMillis() < runUntil)
cnt++;
System.out.println(i + ": " + cnt);
});
Однако результат я получаю:
2: 56443
1: 67506
4: 74693
6: 70549
0: 0
3: 0
5: 0
7: 0
8: 0
9: 0
Так что только 4 задачи выполняются параллельно, а пятая задача начинается только тогда, когда один из первых 4 закончена. Я хочу, чтобы все задания начинались примерно в одно и то же время, и не дожидайтесь друг друга.
Я не согласен с тем, что это дубликат Custom thread pool in Java 8 parallel stream, потому что этот вопрос касается медленных задач, блокирующих другие задачи, в то время как в моем случае я просто хочу знать, как могу (если можно) максимизировать параллелизм, когда используя Stream API.
Каков ожидаемый результат? –
Похоже, у вас есть 4 ядра. – 4castle
«одновременно работает в течение 100 миллисекунд»: вы хотите, чтобы все задачи выполнялись одновременно), или б) каждый из них не заканчивался, пока он не запустился на 100 мс? –