for(Date timerDate1=startDate; timerDate1<=cal3.add(cal3.DATE,7);startDate=cal3.add(cal3.DATE,1))
{
long period=60*60*1000;
Timer timer = new Timer();
timer.schedule(new MyTask(),timerDate,period);
cal3.add(cal3.DATE,1);
}
2 回答
代替 for 循环,使用单个 Timer,并将您的任务传递给scheduleAtFixedRate
Timer 的方法之一,期间为TimeUnit.DAYS.toMillis(1)
.
您的任务类应使用起始日期构建,并且该类应将该日期存储在字段中。在该类的run
方法中,使用 Calendar 检查当前时间(负 7 天)是否晚于任务的开始日期,如果是,则立即调用cancel()
并返回。
使用 timer.scheduleAtFixedRate
void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)
scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task,
long delay,
long period)
安排指定任务以重复固定速率执行,在指定延迟后开始。随后的执行以大约固定的时间间隔进行,间隔指定的时间段。在固定速率执行中,每次执行都是相对于初始执行的计划执行时间安排的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则将快速连续发生两次或更多执行以“赶上”。从长远来看,执行频率将恰好是指定周期的倒数(假设 Object.wait(long) 底层的系统时钟是准确的)。
固定速率执行适用于对绝对时间敏感的重复活动,例如每小时整点响铃,或每天在特定时间运行计划维护。它也适用于执行固定执行次数的总时间很重要的重复活动,例如每秒滴答一次、持续 10 秒的倒计时计时器。最后,固定速率执行适用于调度多个必须彼此保持同步的重复计时器任务。
参数: task - 要调度的任务。delay - 任务执行前的延迟毫秒数。period - 连续任务执行之间的时间(以毫秒为单位)。抛出: IllegalArgumentException - 如果延迟为负,或者延迟 + System.currentTimeMillis() 为负。IllegalStateException - 如果任务已被安排或取消,定时器被取消,或定时器线程终止。