首頁 >Java >java教程 >如何將自訂執行緒池與 Java 8 並行流結合使用?

如何將自訂執行緒池與 Java 8 並行流結合使用?

Linda Hamilton
Linda Hamilton原創
2024-12-24 17:42:18188瀏覽

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

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn