Я попытался запустить 100 задач Sleep параллельно, используя Java8(1.8.0_172) stream.parallel(), представленный внутри пользовательского пула ForkJoinPool с более чем 100 доступными потоками. Каждая задача будет засыпать на 1 секунду. Я ожидал, что вся работа завершится через ~ 1 с, учитывая, что 100 снов можно было выполнить параллельно. Однако я наблюдаю время выполнения 7 с.
@Test
public void testParallelStream() throws Exception {
final int REQUESTS = 100;
ForkJoinPool forkJoinPool = null;
try {
// new ForkJoinPool(256): same results for all tried values of REQUESTS
forkJoinPool = new ForkJoinPool(REQUESTS);
forkJoinPool.submit(() -> {
IntStream stream = IntStream.range(0, REQUESTS);
final List<String> result = stream.parallel().mapToObj(i -> {
try {
System.out.println("request " + i);
Thread.sleep(1000);
return Integer.toString(i);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
// assertThat(result).hasSize(REQUESTS);
}).join();
} finally {
if (forkJoinPool != null) {
forkJoinPool.shutdown();
}
}
}
С выводом, указывающим, что ~ 16 элементов потока выполняются до паузы в 1 с, затем еще ~ 16 и так далее. Таким образом, несмотря на то, что пул forkjoinpool был создан со 100 потоками, кажется, что используется только ~ 16.
Этот шаблон возникает, как только я использую более 23 потоков:
1-23 threads: ~1s
24-35 threads: ~2s
36-48 threads: ~3s
...
System.out.println(Runtime.getRuntime().availableProcessors());
// Output: 4
Runtime.getRuntime().availableProcessors()
результат? - person daniu   schedule 21.01.2020