Angepasster Thread-Pool in parallelem Java 8-Stream

Ist es möglich, zum angeben einer benutzerdefinierten thread-pool für Java 8 parallel stream? Ich kann es nirgends finden.

Vorstellen, dass ich eine server-Anwendung, und ich möchte die parallele streams. Aber die Anwendung ist groß und multi-threaded, so will ich es aufteilen. Ich will nicht einen langsam Laufenden Aufgabe in einem Modul der applicationblock Aufgaben von einem anderen Modul.

Wenn ich nicht verwenden können, die verschiedenen thread-pools für die verschiedenen Module, das bedeutet, ich kann sicher nicht die parallele streams in den meisten realen Situationen.

Versuchen Sie das folgende Beispiel. Es gibt einige CPU-intensive Aufgaben ausgeführt, die in separaten threads.
Die Aufgaben nutzen die parallele streams. Die erste Aufgabe ist gebrochen, so dass jeder Schritt dauert 1 Sekunde (simuliert durch den thread schlafen). Das Problem ist, dass andere threads stecken und warten, bis die defekte Aufgabe zu beenden. Das ist erfundenes Beispiel, aber stellen Sie sich ein servlet-app und jemand der Einreichung eine lange laufende Aufgabe der gemeinsamen fork-join-pool.

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);
    }
}
Kommentar zu dem Problem
Was meinst du mit custom thread-pool? Es gibt einen einzigen gemeinsamen ForkJoinPool, aber Sie können immer Ihre eigenen erstellen ForkJoinPool und Anforderungen übermitteln. Kommentarautor: edharned
Hinweis: Java Champion Heinz Kabutz inspiziert das gleiche problem, aber mit noch schlimmeren Auswirkungen: Deadlocks threads der gemeinsamen fork-join-pool. Siehe javaspecialists.eu/archive/Issue223.html Kommentarautor: Peti

InformationsquelleAutor der Frage Lukas | 2014-01-16

Schreibe einen Kommentar