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 サイトの他の関連記事を参照してください。