1

Это правильно?Это правильно? ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool (numThreads);

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

Я делаю это, так как если я типаж, я буду получать доступ к getActiveCount() и getQueue() методов. Eclipse не помещает никаких ошибок здесь, но я хочу быть уверенным, что то, что я делаю, является правильным.

Это странно, на самом деле, как ThreadPoolExecutor implements ExecutorService и я литье ExecutorService до ThreadPoolExecutor.

ответ

2

Хотя я обычно соглашаюсь с @Evgeniy по причинам, которые он изложил, на самом деле это нормально в этом конкретном случае, потому что Javadoc для ThreadPoolExecutor специально рекомендует использовать фабричные методы для создания экземпляра.

Я считаю это договорным обязательством, что эти методы вернут ожидаемый ThreadPoolExecutor. Я бы не стал полагаться на исходный код, поскольку это может меняться со временем, но явная рекомендация в javadoc должна быть надежной.

Из Javadoc для ThreadPoolExecutor

Чтобы быть полезным в широком диапазоне контекстов, этот класс предоставляет множество настраиваемых параметров и расширяемости крюки. Тем не менее, программистам настоятельно рекомендуется использовать более удобные фабричные методы Executors Executors.newCachedThreadPool() (неограниченный пул потоков с автоматической рекультивацией потоков), Executors.newFixedThreadPool (int) (пул потоков фиксированного размера) и Executors.newSingleThreadExecutor() (один фон thread), которые предварительно настроили параметры для наиболее распространенных сценариев использования. В противном случае используйте следующее руководство при настройке и настройке данного типа вручную:

+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 не говорит об этом. Таким образом, теоретически лучше создать экземпляр ThreadPoolExecutor напрямую с new.

+0

Спасибо, действительно приложите свой быстрый ответ! – ADJ

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