Java 8 並列ストリームのカスタム スレッド プール: 詳細ガイド
Java 8 の並列ストリームは、並列化することで計算を高速化する便利な方法を提供します。複数のスレッドにわたる操作。ただし、複雑なマルチスレッド アプリケーションでは、ボトルネックを回避し、モジュール間の分離を確保することが重要です。ここで疑問が生じます: 並列ストリーム処理にカスタム スレッド プールを利用できますか?
実行できますか?
Java 8 並列ストリームの標準ドキュメントでは、カスタム スレッド プールを使用する可能性について明示的に言及しています。ただし、型破りなソリューションが存在します。
Fork-Join プールのトリック:
並列操作をタスクとして ForkJoinPool に送信すると、その操作はそのプール内に残り、デフォルトの ForkJoinPool.commonPool() は使用しません。これにより、特定のモジュールの専用プールを作成し、そのタスクを潜在的な干渉から分離できます。
実装:
final int parallelism = 4; ForkJoinPool forkJoinPool = null; try { forkJoinPool = new ForkJoinPool(parallelism); final List<Integer> primes = forkJoinPool.submit(() -> // Parallel task here, for example 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(); } }
メカニズム:
ForkJoinTask.fork メソッド。タスクを送信するために使用されます。プールを調べて、現在のタスクが ForkJoinPool で実行されているかどうかを確認します。その場合、並列操作はそのプール内で実行されます。それ以外の場合は、共通プールが使用されます。カスタム ForkJoinPool を介してタスクを送信すると、タスクがそのプールの境界内で確実に動作するようになります。
例:
提供された質問の不自然な例を考えてみましょう。 1 つのモジュール内のタスクは、共有スレッド プール内の他のタスクに影響を与える可能性があります。さまざまなモジュールのカスタム プールを作成し、それらの並列操作をこれらのプールに送信することで、問題を回避し、複雑なシナリオで並列ストリームを安全に利用できます。
結論:
Java 8 並列ストリームはカスタム スレッド プールをネイティブにサポートしていません。Fork-Join Pool トリックは実行可能な解決策を提供します。並列タスクを ForkJoinPool 内のタスクとして送信することで、並列タスクをデフォルトのプールから分離し、特定のモジュール用の専用プールを作成して、パフォーマンスを向上させ、複雑なマルチスレッド アプリケーションの潜在的なボトルネックを回避できます。
以上がJava 8 並列ストリームでカスタム スレッド プールを使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。