Java 8 並列ストリームのカスタムスレッドプールを指定することは可能ですか?どこにも見つかりません。
サーバーアプリケーションがあり、並列ストリームを使用したいとします。しかし、アプリケーションは大きく、マルチスレッドなので、それを区分けしたいと思います。別のモジュールからのapplicationblockタスクの1つのモジュールで実行速度の遅いタスクが必要ではありません。
異なるモジュールに異なるスレッドプールを使用できない場合、それは実際の状況のほとんどで並列ストリームを安全に使用できないことを意味します。
次の例を試してください。別のスレッドで実行されるCPU集中タスクがいくつかあります。タスクは並列ストリームを活用します。最初のタスクは壊れているため、各ステップには1秒かかります(スレッドスリープによってシミュレートされます)。問題は、他のスレッドがスタックして、壊れたタスクが完了するのを待つことです。これは不自然な例ですが、サーブレットアプリと誰かが共有フォーク結合プールに長時間実行タスクを送信するとします。
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
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));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}