ホームページ >Java >&#&チュートリアル >Java 8 並列ストリーム用にスレッド プールをカスタマイズするにはどうすればよいですか?

Java 8 並列ストリーム用にスレッド プールをカスタマイズするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-19 15:51:10863ブラウズ

How Can I Customize Thread Pools for Java 8 Parallel Streams?

Java 8 並列ストリームのスレッド プールのカスタマイズ

Java 8 では並列ストリームが導入され、データ集約型の操作に効率的な並列処理が提供されます。ただし、並列ストリームにカスタム スレッド プールを指定することは、依然としてわかりにくい機能です。この記事では、この問題に対処し、ForkJoinPool を使用した回避策を紹介します。

デフォルトのスレッド プールに関する大きな懸念事項の 1 つは、動作をブロックする可能性があることです。 1 つのストリームでタスクの実行が遅いと、他の並列ストリームでの実行が妨げられる可能性があります。これは、分離が重要なマルチスレッド アプリケーションで特に問題になります。

この制限を克服するには、タスクごとに専用の ForkJoinPool を作成できます。 ForkJoinPool 内の別個のタスクとして並列ストリームを実行すると、ストリームは分離されたままとなり、デフォルトのスレッド プールではなく指定されたスレッド プールを利用します。

次のコード スニペットを考えてみましょう:

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

このコードは、指定された並列処理で新しい ForkJoinPool を作成し、その中で並列ストリームを実行します。並列ストリームは分離されたプールで動作し、他のスレッドからの潜在的な干渉を防ぎます。

このアプローチにより、スレッド割り当てをより詳細に制御できるため、開発者は並列ストリームを区画化し、マルチスレッド アプリケーション内のリソース効率を確保できます。

以上がJava 8 並列ストリーム用にスレッド プールをカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。