Java 8 並行流中的可自訂執行緒池
控制並行流中的執行緒資源分配可增強應用程式效能和模組化。然而,目前尚不清楚如何為 Java 8 中的特定流操作指定自訂執行緒池。
本文探討了這個問題並提供了解決方案,克服了並行流中共享線程池的限制。
問題陳述
考慮使用並行流的伺服器應用程式。為了防止一個模組中的緩慢任務影響其他模組,需要對執行緒池進行劃分。然而,標準並行流實作對所有操作都使用共享執行緒池。
如以下程式碼片段所示,受損任務會無限期延遲其他執行緒:
// 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));
解決方案
要在指定的fork-join 池中執行並行操作,請將其用作內的任務游泳池。這將操作與共用池隔離:
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(); } }
此技術利用ForkJoinTask.fork() 的行為:「在當前任務正在運行的池中異步執行此任務(如果適用),或者使用如果不在在 ForkJoinPool() 中,則為ForkJoinPool.commonPool()。
以上是如何將自訂執行緒池與 Java 8 並行流結合使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!