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 중국어 웹사이트의 기타 관련 기사를 참조하세요!