Ситуация
У меня есть Runnable. У меня есть класс, который планирует этот Runnable для выполнения с помощью ScheduledExecutorService с scheduleWithFixedDelay.
Цель
Я хочу изменить этот класс, чтобы запланировать выполнение Runnable для фиксированной задержки либо на неопределенное время, либо до тех пор, пока оно не будет запущено определенное количество раз, в зависимости от какого-либо параметра, который передается конструктору.
Если возможно, я хотел бы использовать тот же Runnable, что и концептуально то же самое, что должно быть "run".
Возможные подходы
Подход № 1
У вас есть две Runnables, одна из которых отменяет расписание после нескольких исполнений (в которых она хранится), а другая:
public class MyClass{
private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
public enum Mode{
INDEFINITE, FIXED_NO_OF_TIMES
}
public MyClass(Mode mode){
if(mode == Mode.INDEFINITE){
scheduler.scheduleWithFixedDelay(new DoSomethingTask(), 0, 100, TimeUnit.MILLISECONDS);
}else if(mode == Mode.FIXED_NO_OF_TIMES){
scheduler.scheduleWithFixedDelay(new DoSomethingNTimesTask(), 0, 100, TimeUnit.MILLISECONDS);
}
}
private class DoSomethingTask implements Runnable{
@Override
public void run(){
doSomething();
}
}
private class DoSomethingNTimesTask implements Runnable{
private int count = 0;
@Override
public void run(){
doSomething();
count++;
if(count > 42){
// Cancel the scheduling.
// Can you do this inside the run method, presumably using
// the Future returned by the schedule method? Is it a good idea?
}
}
}
private void doSomething(){
// do something
}
}
Я предпочел бы просто запустить Runnable для выполнения метода doSomething. Привязывание планирования к Runnable кажется неправильным. Что вы думаете об этом?
Подход № 2
У вас есть один Runnable для выполнения кода, который мы хотим запустить периодически. Имеет отдельную запланированную runnable, которая проверяет, сколько раз первый Runnable запускал и отменяет, когда он достигает определенной суммы. Это может быть неточным, так как оно будет асинхронным. Это кажется немного громоздким. Что вы думаете об этом?
Подход № 3
Расширьте ScheduledExecutorService и добавьте метод "scheduleWithFixedDelayNTimes". Может быть, такой класс уже существует? В настоящее время я использую Executors.newSingleThreadScheduledExecutor();
для получения экземпляра ScheduledExecutorService. Я предположительно должен был бы реализовать аналогичные функции для создания экземпляра расширенного ScheduledExecutorService. Это может быть сложно. Что вы думаете об этом?
Нет подхода к планировщику [Изменить]
Я не мог использовать планировщик. Вместо этого я мог бы иметь что-то вроде:
for(int i = 0; i < numTimesToRun; i++){
doSomething();
Thread.sleep(delay);
}
И запустите это в каком-то потоке. Что вы думаете об этом? Вы потенциально можете использовать runnable и напрямую вызвать метод run.
Любые предложения приветствуются. Я ищу дебаты, чтобы найти способ "наилучшей практики" для достижения моей цели.