Мне нужно выполнять поток с интервалами, которые могут меняться и динамически изменяются другим потоком

Мне нужно выполнять реализацию Runnable с интервалами времени, которые могут постоянно меняться и настраиваются другим потоком. Могу ли я добиться этого с помощью SchedulerExecutorService и ScheduleWithFixedDelay? Будет делать это:

    ThreadScheduler = backgroundExecutors.scheduleWithFixedDelay(refreshFunc, 5, refreshRate, TimeUnit.SECONDS);

проверить значение переменной refreshRate и соответствующим образом адаптировать?

Я не хочу переводить поток в спящий режим с помощью такой переменной:

    Thread.sleep(variable);

Я был бы благодарен всем, кто может предоставить некоторую полезную информацию здесь.

РЕДАКТИРОВАТЬ: я перефразирую свой вопрос. Если мне нужно изменить временной интервал, связанный с scheduleWithFixedDelay, возможно ли это, когда выполнение задачи выполняется.

РЕДАКТИРОВАТЬ 2:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);      
   ScheduledFuture scheduledFuture;      
   Runnable foo = new Runnable() {         
       public void run() {             
           doSomething();        
       }     
   }      
   while (true) {        
       scheduledFuture = scheduledExecutorService.schedule(foo, refreshRate, TimeUnit.SECONDS);       
       scheduleFuture.cancel();     
} 

Обратите внимание, что RefreshRate постоянно меняется. Будет ли это работать?

РЕДАКТИРОВАТЬ 3:

ScheduledExecutorService scheduleExecutorService = Executors.newScheduledThreadPool(5);
ScheduleFuture scheduledFuture;
Runnable foo = new Runnable() {
    public void run() {
        doSomething();
    }
    scheduledFuture.cancel():
    scheduleFuture = scheduledExecutorService.schedule(foo, refreshRate, TimeUnit.SECONDS);
}
scheduleFuture = scheduledExecutorService.schedule(foo, refreshRate, TimeUnit.SECONDS);
enter code here

Так это то, что вы предлагаете?


person rajath26    schedule 06.05.2014    source источник
comment
Вы можете запланировать следующую задачу из самой задачи   -  person Enno Shioji    schedule 07.05.2014
comment
Возьмите Future, возвращенное операцией scheduleXXX, и cancel() его. Теперь запланируйте новую задачу с новым интервалом.   -  person Boris the Spider    schedule 07.05.2014
comment
Пожалуйста, проверьте мое редактирование выше   -  person rajath26    schedule 07.05.2014


Ответы (1)


scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) дает вам, как следует из названия, фиксированную задержку между выполнениями. Интервал между выполнениями фиксируется параметром delay. После планирования невозможно изменить параметры планирования. Вам нужно будет отменить scheduledFuture и ввести новую команду.

Если ваше планирование времени между запусками является переменным, вариант будет состоять в том, чтобы прочитать следующее время выполнения в конце вашего запуска задания и позволить ему запланировать новое выполнение, используя: schedule(Runnable command, long newDelay, TimeUnit unit)

person maasg    schedule 06.05.2014
comment
По сути, вы предлагаете следующее: ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); ScheduledFuture scheduledFuture; Runnable foo = new Runnable() { public void run() { doSomething(); } } while (true) { scheduledFuture = scheduledExecutorService.schedule(foo, refreshRate, TimeUnit.SECONDS); scheduleFuture.cancel(); } Обратите внимание, что refreshRate постоянно меняется. - person rajath26; 07.05.2014
comment
пожалуйста, проверьте мой РЕДАКТИРОВАТЬ 2 выше. - person rajath26; 07.05.2014
comment
@ rajath26 Нет. Примерно так: ReschedulingRunnable реализует Runnable { public void run() { ...делать вещи ...; long nextDelay = TimeKeeper.getDelay(); расписание (новый ReschedulingRunnable (), следующая задержка, единица времени); }. - person maasg; 07.05.2014
comment
@rajath не нужно while(true) - person maasg; 07.05.2014
comment
проверьте РЕДАКТИРОВАТЬ3. Это то, что вы предлагаете? Это будет работать ? - person rajath26; 07.05.2014
comment
Я бы посоветовал попробовать. Теперь вы поняли идею. - person maasg; 07.05.2014