Прежде всего, я бы полностью избавился от управляющего потока, потому что его работа может быть легко выполнена перед вызовом work()
.
Тогда я бы сделал рабочий поток отличным от основного, таким образом разблокируя основной поток для других задач. Далее я бы добавил функцию для отмены обработки, которая, возможно, установит флажок проверенного рабочего потока.
Edit:
Согласно комментариям, наша цель - ограничить количество work()
вызовов во время каждого throttlePeriod
тиков. Мы можем сделать это лучше, отмечая время в секундомере, сравнивая его после throttleLimit
рабочих операций и оставаясь в спящем режиме. Таким образом, нам снова не нужен поток таймера.
Редактировать: (удалено, неверно)
Изменить:
Мы можем сделать даже некоторый баланс: находясь в пределах throttlePeriod
, мы вычисляем, сколько времени заняло work()
, поэтому мы можем оценить, сколько времени займет все оставшиеся work()
, и ждать каждый два work()
s равная доля оставшегося времени. Это заставит нас не очень быстро выполнять все work()
в начале выделенного периода, возможно, блокируя БД.