Ситуация
У меня есть Runnable.У меня есть класс, который планирует этот Runnable для выполнения с использованием ScheduledExecutorService с scheduleWithFixedDelay .
Цель
Я хочу изменить этот класс, чтобы запланировать Runnable для выполнения с фиксированной задержкой либо на неопределенный срок, или до тех пор, пока он не будет выполнен определенное количество раз, в зависимости от какого-либо параметра, передаваемого в конструктор.
Если возможно, я бы хотелиспользовать тот же Runnable, поскольку концептуально это то же самое, что и «run».
Возможные подходы
Подход # 1
Имеют два Runnable, один из которых отменяетрасписание после ряда выполнений (которых он хранит в счетчике) и без:
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 напрямую.
Любые предложения приветствуются.Я ищу дебаты, чтобы найти «лучший метод» для достижения моей цели.