2014-10-16 4 views
0

클래스 A가 있고 런타임에 클래스의 인스턴스가 여러 개 있습니다.클래스의 각 인스턴스에 스레드 풀이 있습니다.

각 인스턴스가 아래 코드로 5 개의 스레드를 생성합니까?

public class A { 

private void someMethod1(){ 

getPool(); 

} 

private static ExecutorService getPool() { 

     return (ExecutorService) new ThreadPoolExecutor(0, 5, 
       60L, TimeUnit.SECONDS, 
       new SynchronousQueue<Runnable>()); 

    } 
} 

요구 사항 :

가 * 5 = 45 개 스레드가 9 생성됩니다 클래스 A의 9 개 인스턴스가있는 경우,이됩니까? 스레드 수를 예를 들어 50 캐시 가능한 스레드를 한 번만 만든 다음 해당 클래스의 인스턴스를이 스레드 풀을 다시 사용해야합니다 솔루션을 찾고 있는데

+0

그리고''ExecutorService = Executors.newFixedThreadPool (50)''을 사용합니다. –

답변

1

나는 당신이 찾고있는 것 같아요 싱글 톤 , 실행 프로그램 서비스를받을 수있는 게터와 새로운 정적 클래스를 생성하고 호출 어디서나 좋아 :

public class MyExecutors { 

    private static ExecutorService ex; 

    public static synchronized ExecutorService getExecutor(){ 
    if(ex == null){ 
     ex = new ThreadPoolExecutor(0, 50, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); 
    } 
    return ex; 
    } 
} 

지금 바로 모든 경우에 MyExecutors.getExecutor()를 사용합니다. 이것은 각 클래스에 대해 동일한 실행자 인스턴스를 보장합니다.

+0

정말 고마워요. 호출은 MyExecutors.getExecutor()이어야한다고 생각합니다. 또한이 코드를 MyExecutors라는 새로운 클래스 대신 Class A 내에서 사용할 수 있고 클래스 A에있는 전역 클래스에 개인 정적 ExecutorService를 추가 할 수 있습니까? – user3426143

+0

당신은'MyExecutors'의 인스턴스를 생성 할 필요가 없습니다. 어디서든지'MyExecutors.getExecutor()'를 직접 사용할 수 있습니다. – Dima

+0

당신의 예제는 thread로부터 안전하지 않습니다 : 다중 스레드는'ex'가'getExecutor' 메소드를 호출 할 수 있습니다 복수의'ThreadPoolExecutor'를 작성합니다. – ngreen