Почему нет запланированного пула кэшированных потоков, предоставляемого классом Java Executors? - PullRequest
34 голосов
/ 19 июля 2010

Executors обеспечивает newCachedThreadPool() и newScheduledThreadPool(), но не newCachedScheduledThreadPool(), что дает здесь?У меня есть приложение, которое получает пакетные сообщения и должно запланировать довольно длительный шаг обработки после фиксированной задержки для каждого.Временные ограничения не очень жесткие, но я бы предпочел, чтобы на лету создавалось больше потоков, если я превышаю размер пула, а затем обрезаю их обратно в периоды бездействия.Есть ли что-то, что я пропустил в параллельной библиотеке, или мне нужно написать свою собственную?

Ответы [ 4 ]

8 голосов
/ 20 июля 2010

По умолчанию ScheduledThreadPoolExecutor имеет фиксированный размер.Для выполнения задачи вы можете использовать однопоточную версию, которая отправляется обычному ExecutorService.Этот поток событий + рабочий пул довольно легко координировать, и гибкость компенсирует выделенный поток.Я использовал это в прошлом, чтобы заменить TimerTasks и другие некритические задачи, чтобы использовать общего исполнителя в качестве общесистемного пула.

6 голосов
/ 25 февраля 2014

Рекомендуется здесь Почему ScheduledThreadPoolExecutor принимает только фиксированное количество потоков? Обходной путь:

scheduledExecutor = new ScheduledThreadPoolExecutor(128); //no more than 128 threads
scheduledExecutor.setKeepAliveTime(10, TimeUnit.SECONDS);
scheduledExecutor.allowCoreThreadTimeOut(true);
3 голосов
/ 19 июля 2010

java.util.concurrent.Executors - не что иное, как набор статических удобных методов, которые создают общие схемы исполнителей.

Если вы хотите что-то конкретное, чего не предлагает Executors, то смело создавайте собственный экземпляр классов реализации, используя примеры из Executors в качестве руководства.

0 голосов
/ 19 июля 2010

Как говорит скаффман, <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/concurrent/Executors.html" rel="nofollow noreferrer">Executors</a> - это всего лишь набор фабричных методов.если вам нужен конкретный экземпляр, вы всегда можете проверить все существующие <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/concurrent/Executor.html" rel="nofollow noreferrer">Executor</a> разработчики.В вашем случае, я думаю, что было бы неплохо вызвать один из различных конструкторов ScheduledThreadPoolExecutor .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...