2014-10-16 66 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>()); 

    } 
} 

要求:

如果存在类A的实例9,会有9将被创建* 5 = 45个线程?我正在寻找一个解决方案,其中线程的数量,例如50高速缓存线程应该只创建一次,然后该类的任何实例应该重用此线程池

+0

并使用“ExecutorService es = Executors.newFixedThreadPool(50)”' – 2014-10-16 19:40:46

回答

1

我认为你在找什么是一个单身人士,创建一个新的静态类与getter得到执行服务,并将其命名为任何你喜欢:

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()。另外,我可以在我的类A中使用此代码而不是新的类MyExecutors,并在全局类A中添加私有静态ExecutorService ex? – user3426143 2014-10-16 18:24:21

+0

你不需要创建'MyExecutors'的实例,你可以直接在任何地方直接使用'MyExecutors.getExecutor()' – Dima 2014-10-16 19:02:31

+0

你的例子不是线程安全的:多个线程可以调用'getExecutor'方法,而'ex' null,创建多个'ThreadPoolExecutor's。 – ngreen 2014-10-16 19:27:42

相关问题