Czy można określić niestandardową pulę wątków dla równoległego strumienia Java 8 ? Nie mogę tego nigdzie znaleźć.
Wyobraź sobie, że mam aplikację serwera i chciałbym korzystać z równoległych strumieni. Ale aplikacja jest duża i wielowątkowa, więc chcę ją podzielić na części. Nie chcę wolno działającego zadania w jednym module zadań bloku aplikacji z innego modułu.
Jeśli nie mogę użyć różnych pul wątków dla różnych modułów, oznacza to, że nie mogę bezpiecznie używać równoległych strumieni w większości rzeczywistych sytuacji.
Wypróbuj następujący przykład. Niektóre zadania intensywnie wykorzystujące procesor są wykonywane w osobnych wątkach. Zadania wykorzystują równoległe strumienie. Pierwsze zadanie jest zepsute, więc każdy krok zajmuje 1 sekundę (symulowany przez uśpienie wątku). Problem polega na tym, że inne wątki blokują się i czekają na zakończenie przerwanego zadania. To wymyślony przykład, ale wyobraź sobie aplikację serwletu i kogoś, kto przesyła długo działające zadanie do wspólnej puli dołączania wideł.
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);
}
}