Executors
предоставляет newCachedThreadPool()
и newScheduledThreadPool()
, но не newCachedScheduledThreadPool()
, что здесь дает? У меня есть приложение, которое получает всплывающие сообщения и требует запланировать довольно длительный шаг обработки после фиксированной задержки для каждого. Ограничения по времени не слишком жесткие, но я предпочел бы, чтобы на протяжении лета было создано больше потоков, если я превышу размер пула, а затем уберу их в периоды бездействия. Есть ли что-то, что я пропустил в параллельной библиотеке, или мне нужно написать свой собственный?
Почему нет запланированного кэшированного пула потоков, предоставляемого классом Java Executors?
Ответ 1
По конструкции ScheduledThreadPoolExecutor является фиксированным размером. Вы можете использовать однопоточную версию, которая отправляется в обычный ExecutorService для выполнения задачи. Этот поток событий + рабочий пул довольно легко согласовывается, и гибкость компенсирует выделенный поток. Я использовал это в прошлом, чтобы заменить TimerTasks и другие некритические задачи, чтобы использовать общий исполнитель как общесистемный пул.
Ответ 2
Предлагается здесь Почему ScheduledThreadPoolExecutor принимает только фиксированное количество потоков? обход:
scheduledExecutor = new ScheduledThreadPoolExecutor(128); //no more than 128 threads
scheduledExecutor.setKeepAliveTime(10, TimeUnit.SECONDS);
scheduledExecutor.allowCoreThreadTimeOut(true);
Ответ 3
java.util.concurrent.Executors
- это не что иное, как набор статических методов удобства, которые создают общие расположения исполнителей.
Если вы хотите что-то конкретное, которое не предлагается Executors
, тогда не стесняйтесь создавать свой собственный экземпляр классов реализации, используя примеры в Executors
в качестве руководства.
Ответ 4
Как скаффман говорит, Executors
- это всего лишь набор методов factory. если вам нужен конкретный экземпляр, вы всегда можете проверить всех существующих разработчиков Executor
. В вашем случае я думаю, что хорошая идея для вызова одного из различных конструкторов ScheduledThreadPoolExecutor.