Я пытаюсь запланировать поток в определенное время дня, например, в 4 часа утра, каждый день, перепланируя даже после обнаружения исключения.
У меня был запланирован поток при запуске приложения, перепланирующий самс простым ScheduledThreadPoolExecutor.schedule (новый ThreadItself) в конце его выполнения.Но мне нужно указать начальную задержку для потока.Я знал о scheduleAtFixedDelay / Rate, но по документации он останавливает следующие выполнения потока, если есть исключение.
У меня было это
Внутри MyScheduler
public class MyScheduler{
public void init(){
ScheduledThreadPoolExecutor myScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
myScheduledThreadPoolExecutor.schedule(new MyThread(), delay, TimeUnit.HOURS);
}
public void scheduleNextMyThread(int delay){
myScheduledThreadPoolExecutor.schedule(new MyThread(), delay, TimeUnit.HOURS);
}
}
Внутри цепочки
public class MyThread extends Thread {
private MyScheduler myScheduler;
public MyThread(Thread scheduler) {
this.myScheduler = scheduler;
}
@Override
public void run() {
try {
// Try Work
} catch (Exception exc) {
// Catch Exception
} finally {
// Reschedule myself
myScheduler.scheduleNextMyThread(delay);
}
}
}
Я пытаюсь перепланировать MyThread в определенное время, используя scheduleAtFixedRate (), чтобы установить начальную задержку и перепланировать себя.
Я закончил тем, что написал это
Inside MyScheduler
myScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
public void scheduleMyThreadAtFixedRate(int delay){
Calendar cal = Calendar.getInstance();
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)+1, 4, 0, 0);
myScheduledThreadPoolExecutor.scheduleAtFixedRate(new MyThread(), initialDelay, delay, TimeUnit.HOURS);
}
Внутри MyThread
public class MyThread extends Thread {
private Scheduler scheduler;
public MyThread(Thread scheduler) {
this.scheduler = scheduler;
}
@Override
public void run() {
try {
// Try Work
} catch (Exception exc) {
// Catch Exception
// HERE IS MY DOUBT. IS THIS NECESSARY?
myScheduler.scheduleMyThreadAtFixedRate(delay);
}
}
}
Итак ... Возникло исключение.Необходимо ли перепланировать MyThread еще раз внутри блока catch или, поскольку исключения не генерируются, он продолжает свое обычное планирование?