如何在一天内只运行一次timertask?

时间:2013-01-29 10:54:28

标签: java

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 个答案:

答案 0 :(得分:0)

使用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)下的系统时钟是准确的)。

固定费率执行适用于对绝对时间敏感的重复活动,例如每小时按小时响铃,或在特定时间每天运行定期维护。它也适用于重复活动,其中执行固定执行次数的总时间很重要,例如倒计时器,每秒钟滴答一次,持续十秒钟。最后,固定速率执行适用于安排必须保持彼此同步的多个重复计时器任务。

参数:task - 要安排的任务。延迟 - 执行任务之前的延迟(以毫秒为单位)。 period - 连续任务执行之间的时间(以毫秒为单位)。抛出:IllegalArgumentException - 如果延迟为负,或者延迟+ System.currentTimeMillis()为负。 IllegalStateException - 如果已安排或取消任务,则取消计时器或终止计时器线程。

答案 1 :(得分:0)

使用单个Timer,而不是for循环,将任务传递给Timer的scheduleAtFixedRate方法之一,周期为TimeUnit.DAYS.toMillis(1)

您的任务类应使用起始日期构建,并且该类应将该日期存储在字段中。在班级的run方法中,使用日历检查当前时间减去7天是否晚于任务的开始日期,如果是,请调用cancel()并立即返回。

相关问题