


Wie kann ich benutzerdefinierte Thread-Pools mit parallelen Java 8-Streams verwenden?
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(); } }</integer>
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

Dreamweaver CS6
Visuelle Webentwicklungstools

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor