Как вы даете службе ScheduledExecutor максимальное время для продолжения запуска новых потоков? - PullRequest
0 голосов
/ 10 февраля 2019

Возьмите ScheduledThreadPoolExecutor, как показано ниже.Как вы предоставляете самому исполнителю временное окно, в котором он может запускать новые потоки.За пределами этого временного окна он должен прекратить запуск новых потоков с фиксированной скоростью.

executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Runnable(){}, 0, 1, TimeUnit.DAYS);

Например, 1

if executor has run for <= 1s stop launching thread  
if executor has run for > 1s and < 3s. Start and keep launching thread 
if executor has run for < 3s stop launching thread.

В качестве альтернативы, если исполнителю может быть предоставлентайм-аут, который также будет работать.Заметьте, я не говорю о том, чтобы дать потоку тайм-аут, но сам исполнитель.

У меня есть одно решение - добавить трекер времени в сам поток, но мне интересно, есть ли более нативные способы сделать это.

1 Ответ

0 голосов
/ 10 февраля 2019

Нет "нативного" решения.
Лучше было бы (просто добавить мои идеи)

  • собрать и сохранить все Future<?> (s), возвращенные из scheduleAtFixedRate
  • использовать планировщик заданий, например Quartz, для запуска заданий в определенное время / или даже в другое время ScheduledExecutor
  • реагировать на «события», запускаемые заданиями Quartz, отменяя все сохраненныеFuture<?> (s) (без остановки исполнителя) / изменение Executor реализация на лету для пользовательской версии без операции

Это немного непрактично.Имхо, я думаю, вы пытаетесь сделать что-то умное, что можно решить более «стандартными» способами.

...