Benutzerdefinierter Thread-Pool im parallelen Java 8-Stream

Ist es möglich, einen benutzerdefinierten Thread-Pool für Java 8 anzugeben?paralleler Strom? Ich kann es nirgendwo finden.

Stellen Sie sich vor, ich habe eine Serveranwendung und möchte parallele Streams verwenden. Aber die Anwendung ist groß und multithreaded, also möchte ich sie unterteilen. Ich möchte nicht, dass eine langsame Task in einem Modul der Applicationblock-Tasks von einem anderen Modul ausgeführt wird.

Wenn ich nicht verschiedene Thread-Pools für verschiedene Module verwenden kann, bedeutet dies, dass ich in den meisten Situationen der realen Welt keine sicheren parallelen Streams verwenden kann.

Versuchen Sie das folgende Beispiel. Es gibt einige CPU-intensive Aufgaben, die in separaten Threads ausgeführt werden. Die Aufgaben nutzen parallele Streams. Die erste Aufgabe ist unterbrochen, sodass jeder Schritt 1 Sekunde dauert (simuliert durch Thread-Ruhezustand). Das Problem ist, dass andere Threads hängen bleiben und warten, bis die unterbrochene Aufgabe abgeschlossen ist. Dies ist ein ausgedachtes Beispiel, aber stellen Sie sich eine Servlet-App und jemanden vor, der eine lang laufende Aufgabe an den gemeinsam genutzten Fork-Join-Pool sendet.

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

Antworten auf die Frage(13)

Ihre Antwort auf die Frage