Итак, я знаю, что если вы используете parallelStream
без специального ForkJoinPool, он будет использовать ForkJoinPool по умолчанию, который по умолчанию имеет меньше потоков, чем у вас есть.
Итак, как указано здесь (а также в другом ответе этого вопроса), чтобы иметь больше parallelism, вы должны:
отправьте выполнение параллельного потока на свой собственный ForkJoinPool: yourFJP.submit(() → stream.parallel(). forEach (doSomething));
Итак, я сделал это:
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;
import com.google.common.collect.Sets;
public class Main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ForkJoinPool forkJoinPool = new ForkJoinPool(1000);
IntStream stream = IntStream.range(0, 999999);
final Set<String> thNames = Collections.synchronizedSet(new HashSet<String>());
forkJoinPool.submit(() -> {
stream.parallel().forEach(n -> {
System.out.println("Processing n: " + n);
try {
Thread.sleep(500);
thNames.add(Thread.currentThread().getName());
System.out.println("Size: " + thNames.size() + " activeCount: " + forkJoinPool.getActiveThreadCount());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}).get();
}
}
Я создал набор имен потоков, чтобы узнать, сколько потоков создается, а также зарегистрировано количество активных потоков, которые имеет пул, и оба числа не вырастают больше, чем 16, поэтому это означает, что parallelism здесь не более 16 (почему даже 16?). Если я не использую forkJoinPool, я получаю 4 как parallelism, что соответствует количеству процессоров, которые у меня есть.
Почему это дает мне 16, а не 1000?