Heim >Java >javaLernprogramm >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(); } }
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!