>Java >java지도 시간 >Java 8 병렬 스트림이 작업 격리를 위해 사용자 정의 스레드 풀을 사용할 수 있습니까?

Java 8 병렬 스트림이 작업 격리를 위해 사용자 정의 스레드 풀을 사용할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-19 10:23:13336검색

Can Java 8 Parallel Streams Use Custom Thread Pools for Task Isolation?

Java 8 병렬 스트림용 사용자 정의 스레드 풀

Java 8 병렬 스트림 영역에서는 다음과 같은 질문이 제기됩니다. 특정 작업을 위한 사용자 정의 스레드 풀? 광범위한 검색에도 불구하고 많은 개발자는 이 기능을 사용하지 못했습니다.

병렬 스트림이 필요한 다중 스레드 서버 애플리케이션을 고려해 보십시오. 그러나 구획화를 유지하고 한 모듈의 작업이 다른 모듈을 차단하는 것을 방지하려면 각 모듈마다 서로 다른 스레드 풀이 필요합니다.

문제를 설명하려면 다음 예를 고려하세요.

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));

여기서 고안된 예에서는 CPU 집약적인 작업이 Executors.newCachedThreadPool()을 사용하여 병렬로 실행됩니다. 첫 번째 작업은 시뮬레이션된 스레드 절전으로 인해 의도적으로 속도가 느려집니다. 결과적으로 다른 작업이 중단되어 완료를 기다리고 있습니다. 이는 한 모듈의 느린 작업이 다른 모듈의 작업을 어떻게 방해할 수 있는지를 보여줍니다.

그러나 이 딜레마에 대한 영리한 해결책이 있습니다. 특정 포크 조인 풀 내에서 작업으로 병렬 작업을 실행하는 것. 이렇게 하면 다른 병렬 스트림 작업에서 사용하는 공통 포크-조인 풀로부터 격리된 상태로 유지됩니다.

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.commonPool()이 사용됩니다.

이 접근 방식을 활용하면 성능 저하나 작업 구분 없이 멀티 스레드 애플리케이션 내의 다양한 모듈에서 병렬 스트림을 안전하게 사용할 수 있습니다.

위 내용은 Java 8 병렬 스트림이 작업 격리를 위해 사용자 정의 스레드 풀을 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.