Niestandardowa pula wątków w strumieniu równoległym Java 8
Czy możliwe jest określenie niestandardowej puli wątków dla środowiska Java 8strumień równoległy? Nie mogę tego nigdzie znaleźć.
Wyobraź sobie, że mam aplikację serwerową i chciałbym używać strumieni równoległych. Ale aplikacja jest duża i wielowątkowa, więc chcę ją podzielić. Nie chcę wolnego zadania w jednym module zadań Applicationblock z innego modułu.
Jeśli nie mogę używać różnych pul wątków dla różnych modułów, oznacza to, że nie mogę bezpiecznie korzystać z równoległych strumieni w większości rzeczywistych sytuacji.
Wypróbuj następujący przykład. Niektóre zadania intensywnie pracują w oddzielnych wątkach. Zadania wykorzystują równoległe strumienie. Pierwsze zadanie jest przerwane, więc każdy krok trwa 1 sekundę (symulowany przez senny wątek). Problem polega na tym, że inne wątki utknęły i czekają, aż zakończone zadanie się zakończy. Jest to wymyślony przykład, ale wyobraź sobie, że aplikacja serwletowa i ktoś wysyłający długie zadanie do współużytkowanego widelca dołączają do puli.
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}