2017-11-24 7 views
3

Executors.newWorkStealingPool()은 대상 병렬 처리를 사용하여 제한된 동시성 풀을 생성 할 수 있습니다. 후드에서 기본 작업자 생성 팩토리가있는 here으로 새 ForkJoinPool을 만드는 것으로 보입니다.Java 작업 도용 풀 (ForkJoinPool)이 사전 생성 된 스레드를 스레드 풀에서 지원하지 않는 이유는 무엇입니까?

이 팩토리는 원하는 동시성에 도달 할 때까지 새로운 스레드를 생성하는 것으로 보입니다. 이 풀은 기존 풀의 스레드 하위 집합을 사용하여 제한된 동시성을 지원하면서 매번 새로운 스레드를 만들지 않는 이유는 무엇입니까? 스레드 작성은 Java에서 비용이 많이 든다고 가정합니다.

관련 : Use only a subset of threads in an ExecutorService

답변

3

왜이 풀은 여전히 ​​매번 새로운 스레드의 생성을 피하면서 제한된 동시성을 지원하기 위해 기존 풀에서 스레드의 부분 집합을 사용하는 것을 허용하지 않습니다?

ThreadThreadFactory API를 사용하면 임의의 Thread 객체를 재활용 할 수 없습니다. 문제는 ThreadFactory::newThread은 주어진 Runnable의 스레드를 반환하도록 구현해야하지만 Thread API는 만 Thread 생성자에 의해 설정 될 수 있습니다.

  • Thread에 고정하면 모델이 손상 될 수 있습니다. (무엇이 시작된 스레드의 Runnable을 대체하는 것을 의미한다.)

  • 그것은 이론적으로 실제 run() 방법은 사용자가 제공 한 루프에서 Runnable를 실행 Thread의 서브 클래스를 정의하여 고정 할 수있다. 하지만 복잡 해지면 ... 그 서브 클래스의 인스턴스를 재사용 할 수있을 것입니다 ... 임의의 스레드가 아닙니다.

+0

그러나 Executors.newFixedThreadPool() 등으로 만든 스레드와 다양한 응용 프로그램에서 사용하는 스레드 풀이 스레드를 재활용하지 않는 것은 사실입니까? ForkJoinPool 내에서도 여러 작업이 동일한 풀에 제출되고 기존 스레드가 스레드를 효과적으로 재활용하는 특정 실행 파일/호출 가능 개체의 실행보다 오래 지속되는 경우 –

+1

예. 그러나 그 (recyling)는'Runnable'에 의해 수행됩니다. 예를 들어, 쓰레드 풀은'runnable'을 가진 새로운 쓰레드를 인스턴스화 할 것이고'run()'메쏘드는 그 쓰레드를 풀에 반환하고 더 많은 작업을 기다릴 것입니다. API와 구현 코드를 살펴보십시오. –

+0

확인. 그 이유는 ForkJoinPool의 작업을 주입하는 ForkJoinPool의 WorkQueue가 풀 자체와 결합되어 정의 된 동시성 수준의 임의 작업 대기열을 만들 수 없으며 포크 조인 풀을 사용하여 강제로 사용할 수 없다는 것입니다. Java에서 스레드를 만드는 것이 비용이 많이 든다고 생각하기 때문에 누락 된 기능이라고 생각합니다. https://stackoverflow.com/a/5483105/161628 –