Я пытаюсь создать Timer/TimerTask, который будет работать в один и тот же день каждого месяца. Я не могу запланировать повторяющийся таймер, потому что месяц не всегда будет одинаковой продолжительности.
Итак, вот мое решение:
public class MyTask extends TimerTask {
public void run(){
//do process file stuff
if(scheduledExecutionTime() != 0){
TimerHelper.restartMyTimer();
}
}
}
public class TimerHelper {
public static HashTable timersTable = new HashTable();
public static void restartMyTimer(){
Calendar runDate = Calendar.getInstance();
runDate.set(Calendar.DAY_OF_MONTH, 1);
runDate.set(Calendar.HOUR_OF_DAY, 4);
runDate.set(Calendar.MINUTE, 0);
runDate.add(Calendar.MONTH, 1);//set to next month
MyTask myTask = new MyTask();
Timer myTimer = new Timer();
myTimer.schedule(myTask, runDate.getTime());
timersTable = new HashTable();//keeping a reference to the timer so we
timersTable.put("1", myTimer);//have the option to cancel it later
}
}
Проблема, с которой, я думаю, я столкнусь, заключается в том, что, поскольку первая TimerTask создает второй Timer, будет ли первый Timer сохранен, потому что он создал второй? После того, как код завершится на первом таймере, об этом потоке и объекте позаботится сборка мусора? Со временем я не хочу создавать кучу потоков, которые ничего не делают, но не удаляются. Может быть, у меня нет правильного понимания того, как работают потоки и таймеры...
Я открыт для предложений других способов создания ежемесячного таймера, если мне не нужно использовать сторонние JAR-файлы.
Спасибо!