1

이것이 맞습니까? 내가 캐스트 경우, 내가 getActiveCount()getQueue() 방법에 대한 액세스를 얻을 것이다 이후이것이 맞습니까? ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool (numThreads);

ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)   
             Executors.newFixedThreadPool(numThreads); 

나는,이 일을하고있다. 이클립스는 여기서 오류를 표시하지 않지만, 내가하고있는 일이 올바른지 확인하고 싶다.

실제로는 ThreadPoolExecutor implements ExecutorService으로 이상한데, ExecutorService에서 ThreadPoolExecutor으로 캐스팅하고 있습니다.

답변

2

나는 그가 명시한 이유로 @Evgeniy에 보통 동의하지만, ThreadPoolExecutor에 대한 Javadoc은 특별히 인스턴스를 생성하기 위해 팩토리 메소드를 사용하도록 권장하기 때문에이 특정 케이스에서는 실제로 OK입니다.

나는이 메소드가 예상되는 ThreadPoolExecutor를 반환한다는 계약 상 의무로 간주 할 것이다. 시간이 지남에 따라 변경 될 수 있으므로 소스 코드를 보는 것에 의존하지는 않겠지 만 javadoc의 명시적인 권장 사항은 신뢰할 수 있어야합니다. ThreadPoolExecutor입니다

를위한 Javadoc에서

이 클래스는 조정 가능한 매개 변수 및 확장 후크 많은을 제공, 상황의 넓은 범위에 걸쳐 유용합니다. 다만, 프로그래머는,보다 편리한 Executors 팩토리 메소드 인 Executors.newCachedThreadPool() (자동 thread 재생 기능을 가지는 무제한 thread 풀), Executors.newFixedThreadPool (int) (고정 사이즈 thread 풀) 및 Executors.newSingleThreadExecutor() (단일의 백그라운드 스레드)를 사용하여 가장 일반적인 사용 시나리오에 대한 설정을 사전 구성합니다. 그렇지 않은 경우이 클래스를 수동으로 구성하고 조정할 때 다음 가이드를 사용하십시오.

+0

그들은 그것을 준수하게되어 기쁘다면 왜 처음에는'ThreadPoolExecutor'를 반환하지 않았을까요? API 결함처럼 보입니다. – bacar

1

newFixedThreadPool의 소스 코드를 살펴보면 ThreadPoolExecutor를 반환한다는 것을 알 수 있습니다. 그러면 향후 "newFixedThreadPool"구현을 변경하면 캐스팅에서 예외가 발생하지 않고 코드가 작동하지 않을 수도 있습니다.

public static ExecutorService newFixedThreadPool(int nThreads) { 
     return new ThreadPoolExecutor(nThreads, nThreads, 
             0L, TimeUnit.MILLISECONDS, 
             new LinkedBlockingQueue<Runnable>()); 
    } 
+0

감사합니다. 신속하게 답변 해 주셔서 감사합니다. – ADJ

2

우리는 Executors.newFixedThreadPool 그렇게 말하지 않는다 ThreadPoolExecutor입니다 만 실행자 API를 반환 실행자의 소스 코드에서 알고있다. 따라서 이론적으로는 new으로 직접 ThreadPoolExecutor 인스턴스를 만드는 것이 좋습니다.

+0

감사합니다. 정말 신속한 답장을 보내주십시오! – ADJ

관련 문제