Executors.newWorkStealingPool()은 대상 병렬 처리를 사용하여 제한된 동시성 풀을 생성 할 수 있습니다. 후드에서 기본 작업자 생성 팩토리가있는 here으로 새 ForkJoinPool을 만드는 것으로 보입니다.Java 작업 도용 풀 (ForkJoinPool)이 사전 생성 된 스레드를 스레드 풀에서 지원하지 않는 이유는 무엇입니까?
이 팩토리는 원하는 동시성에 도달 할 때까지 새로운 스레드를 생성하는 것으로 보입니다. 이 풀은 기존 풀의 스레드 하위 집합을 사용하여 제한된 동시성을 지원하면서 매번 새로운 스레드를 만들지 않는 이유는 무엇입니까? 스레드 작성은 Java에서 비용이 많이 든다고 가정합니다.
관련 : Use only a subset of threads in an ExecutorService
그러나 Executors.newFixedThreadPool() 등으로 만든 스레드와 다양한 응용 프로그램에서 사용하는 스레드 풀이 스레드를 재활용하지 않는 것은 사실입니까? ForkJoinPool 내에서도 여러 작업이 동일한 풀에 제출되고 기존 스레드가 스레드를 효과적으로 재활용하는 특정 실행 파일/호출 가능 개체의 실행보다 오래 지속되는 경우 –
예. 그러나 그 (recyling)는'Runnable'에 의해 수행됩니다. 예를 들어, 쓰레드 풀은'runnable'을 가진 새로운 쓰레드를 인스턴스화 할 것이고'run()'메쏘드는 그 쓰레드를 풀에 반환하고 더 많은 작업을 기다릴 것입니다. API와 구현 코드를 살펴보십시오. –
확인. 그 이유는 ForkJoinPool의 작업을 주입하는 ForkJoinPool의 WorkQueue가 풀 자체와 결합되어 정의 된 동시성 수준의 임의 작업 대기열을 만들 수 없으며 포크 조인 풀을 사용하여 강제로 사용할 수 없다는 것입니다. Java에서 스레드를 만드는 것이 비용이 많이 든다고 생각하기 때문에 누락 된 기능이라고 생각합니다. https://stackoverflow.com/a/5483105/161628 –