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>()); 

    } 
} 

Требование:

Если есть 9 экземпляров класса А, там будет 9 * 5 = 45 нитей будет создано? Я ищу решение, в котором количество потоков, например 50 потоков с возможностью кэширования, должно создаваться только один раз, а затем любой экземпляр этого класса должен повторно использовать этот пул потоков

+0

И используйте '' ExecutorService es = 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 и добавить приватную старую executorService ex в класс A глобально? – user3426143

+0

вам не нужно создавать экземпляр 'MyExecutors', вы можете просто использовать' MyExecutors.getExecutor() 'из любого места – Dima

+0

Ваш пример небезопасен: несколько потоков могут вызывать метод getExecutor, а' ex' - null, создавая несколько 'ThreadPoolExecutor'. – ngreen

Смежные вопросы