Java 8 병렬 스트림에 대한 사용자 정의 스레드 풀을 지정할 수 있습니까? 어디서나 찾을 수 없습니다.
서버 응용 프로그램이 있고 병렬 스트림을 사용하고 싶다고 가정하십시오. 그러나 응용 프로그램은 크고 멀티 스레드이므로 구획화하고 싶습니다. 한 모듈의 응용 프로그램에서 다른 모듈의 작업을 느리게 실행하고 싶지 않습니다.
다른 모듈에 대해 다른 스레드 풀을 사용할 수 없으면 대부분의 실제 상황에서 병렬 스트림을 안전하게 사용할 수 없습니다.
다음 예제를 시도하십시오. 별도의 스레드에서 실행되는 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);
}
}