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