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);
    }
}

questionAnswers(13)

yourAnswerToTheQuestion