Heim >Java >javaLernprogramm >Wie kann ich benutzerdefinierte Thread-Pools mit parallelen Java 8-Streams verwenden?

Wie kann ich benutzerdefinierte Thread-Pools mit parallelen Java 8-Streams verwenden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-24 17:42:18194Durchsuche

How Can I Use Custom Thread Pools with Java 8 Parallel Streams?

Anpassbare Thread-Pools in Java 8 Parallel Streams

Die Steuerung der Thread-Ressourcenzuteilung innerhalb paralleler Streams verbessert die Anwendungsleistung und Modularität. Es bleibt jedoch unklar, wie benutzerdefinierte Thread-Pools für bestimmte Stream-Vorgänge in Java 8 festgelegt werden.

Dieser Artikel untersucht das Problem und bietet eine Lösung, mit der die Einschränkung gemeinsamer Thread-Pools in parallelen Streams überwunden wird.

Problemstellung

Stellen Sie sich eine Serveranwendung vor, die parallele Streams nutzt. Um zu verhindern, dass sich träge Aufgaben innerhalb eines Moduls auf andere auswirken, ist eine Aufteilung des Thread-Pools erwünscht. Die standardmäßige Parallel-Stream-Implementierung verwendet jedoch einen gemeinsamen Thread-Pool für alle Vorgänge.

Wie das folgende Code-Snippet zeigt, verzögert eine kompromittierte Aufgabe andere Threads auf unbestimmte Zeit:

// CPU-intensive tasks in separate threads leveraging parallel streams
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));

Lösung

Um parallele Vorgänge innerhalb eines bestimmten Fork-Join-Pools auszuführen, verwenden Sie ihn als Aufgabe darin der Pool. Dadurch wird der Vorgang vom gemeinsam genutzten Pool isoliert:

final int parallelism = 4;
ForkJoinPool forkJoinPool = null;
try {
    forkJoinPool = new ForkJoinPool(parallelism);
    final List<Integer> primes = forkJoinPool.submit(() -> {
        // Parallel task here, for example:
        return IntStream.range(1, 1_000_000).parallel()
                .filter(PrimesPrint::isPrime)
                .boxed()
                .collect(Collectors.toList());
    }).get();
    System.out.println(primes);
} catch (Exception e) {
    throw new RuntimeException(e);
} finally {
    if (forkJoinPool != null) {
        forkJoinPool.shutdown();
    }
}

Diese Technik nutzt das Verhalten von ForkJoinTask.fork(): „Führen Sie diese Aufgabe asynchron in dem Pool aus, in dem die aktuelle Aufgabe ausgeführt wird (sofern zutreffend) oder den sie verwendet der ForkJoinPool.commonPool(), wenn nicht in ForkJoinPool()."

Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Thread-Pools mit parallelen Java 8-Streams verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn