Я подозреваю, что ничто из java.util.concurrent
не сделает это за вас, просто потому, что если вам нужна служба выполнения по расписанию, то вам часто приходится выполнять повторяющиеся задачи. Если у вас есть повторяющаяся задача, то обычно имеет больше смысла, чтобы просто сохранить тот же поток и использовать его для следующего повторения задачи, а не разрывать поток и создавать новый. при следующем повторении.
Конечно, запланированный исполнитель может быть использован для вставки задержек между неповторяющимися задачами, или он может использоваться в тех случаях, когда ресурсы настолько ограничены, а повторения настолько редки, что имеет смысл сносить все ваши потоки до появления новых работа приходит. Поэтому я вижу случаи, когда ваше предложение определенно имело бы смысл.
Чтобы реализовать это, я рассмотрел бы попытку обернуть кэшированный пул потоков из Executors.newCachedThreadPool
вместе с однопоточным сервисом запланированного выполнения (т. Е. new ScheduledThreadPoolExecutor(1)
). Задачи могут быть запланированы через службу запланированного исполнителя, но запланированные задачи будут упакованы таким образом, что вместо того, чтобы ваш однопоточный запланированный исполнитель выполнял их, однопоточный исполнитель передал бы их в пул кэшированных потоков для фактического выполнение.
Этот компромисс даст вам максимум один работающий поток, когда совершенно не нужно выполнять работу, и даст вам столько потоков, сколько вам нужно (в пределах вашей системы, конечно), когда есть много работа, чтобы сделать.