Java 8 병렬 스트림용 사용자 정의 스레드 풀: 세부 가이드
Java 8의 병렬 스트림은 병렬화를 통해 계산을 가속화하는 편리한 방법을 제공합니다. 여러 스레드에 걸친 작업. 그러나 복잡한 멀티스레드 애플리케이션에서는 병목 현상을 방지하고 모듈 간 격리를 보장하는 것이 중요합니다. 이로 인해 질문이 제기됩니다. 병렬 스트림 처리를 위해 사용자 정의 스레드 풀을 활용할 수 있습니까?
가능한가요?
Java 8 병렬 스트림에 대한 표준 문서는 그렇지 않습니다. 사용자 정의 스레드 풀 사용 가능성을 명시적으로 언급합니다. 그러나 색다른 솔루션이 있습니다.
Fork-Join Pool 트릭:
병렬 작업을 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을 통해 작업을 제출하면 해당 풀의 경계 내에서 작업이 작동하는지 확인할 수 있습니다.
예:
제공된 질문에 있는 인위적인 예를 고려하세요. 한 모듈의 작업은 공유 스레드 풀의 다른 작업에 영향을 미칠 수 있습니다. 다양한 모듈에 대한 사용자 지정 풀을 생성하고 병렬 작업을 이러한 풀에 제출하면 문제를 방지하고 복잡한 시나리오에서 병렬 스트림을 안전하게 활용할 수 있습니다.
결론:
그동안 Java 8 병렬 스트림은 기본적으로 사용자 정의 스레드 풀을 지원하지 않으며 Fork-Join Pool 트릭이 실행 가능한 솔루션을 제공합니다. ForkJoinPool의 작업으로 병렬 작업을 제출하면 해당 작업을 기본 풀에서 격리하고 특정 모듈에 대한 전용 풀을 생성하여 성능을 향상하고 복잡한 멀티스레드 애플리케이션에서 잠재적인 병목 현상을 방지할 수 있습니다.
위 내용은 Java 8 병렬 스트림과 함께 사용자 정의 스레드 풀을 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!