ScheduleIterator接口
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
importjava.util.Date;

public
interface
ScheduleIterator

{
publicDatenext();//获取下一个触发的时间点
}
Scheduler类
importjava.util.Date;
importjava.util.Timer;
importjava.util.TimerTask;


public
class
Scheduler

{
classSchedulerTimerTaskextendsTimerTask


{
privateSchedulerTaskschedulerTask;
privateScheduleIteratoriterator;
publicSchedulerTimerTask(SchedulerTaskschedulerTask,ScheduleIteratoriterator)


{
this.schedulerTask=schedulerTask;
this.iterator=iterator;
}
publicvoidrun()


{
schedulerTask.run();
reschedule(schedulerTask,iterator);
}
}

privatefinalTimertimer=newTimer();

publicScheduler()


{
}
publicvoidcancel()


{
timer.cancel();
}
publicvoidschedule(SchedulerTaskschedulerTask,ScheduleIteratoriterator)


{
Datetime=iterator.next();
if(time==null)


{
schedulerTask.cancel();
}
else


{
synchronized(schedulerTask.lock)


{
if(schedulerTask.state!=SchedulerTask.VIRGIN)


{
thrownewIllegalStateException("Taskalreadyscheduled"+
"orcancelled");
}
schedulerTask.state=SchedulerTask.SCHEDULED;
schedulerTask.timerTask=newSchedulerTimerTask(schedulerTask,iterator);
timer.schedule(schedulerTask.timerTask,time);
}
}
}

privatevoidreschedule(SchedulerTaskschedulerTask,ScheduleIteratoriterator)


{
Datetime=iterator.next();
if(time==null)


{
schedulerTask.cancel();
}
else


{
synchronized(schedulerTask.lock)


{
if(schedulerTask.state!=SchedulerTask.CANCELLED)


{
schedulerTask.timerTask=newSchedulerTimerTask(schedulerTask,iterator);
timer.schedule(schedulerTask.timerTask,time);
}
}
}
}
}
SchedulerTask 类
importjava.util.TimerTask;

public
abstract
class
SchedulerTaskimplementsRunnable

{//被调度器不断调度执行的任务

finalObjectlock=newObject();

intstate=VIRGIN;//任务状态
staticfinalintVIRGIN=0;
staticfinalintSCHEDULED=1;
staticfinalintCANCELLED=2;

TimerTasktimerTask;//底层的定时器任务
protectedSchedulerTask()


{
}
publicabstractvoidrun();//调度任务执行的具体任务
publicbooleancancel()


{
synchronized(lock)


{
if(timerTask!=null)


{
timerTask.cancel();//取消任务
}
booleanresult=(state==SCHEDULED);//任务已经被调度执行
state=CANCELLED;//设置任务状态为“取消”
returnresult;
}
}
publiclongscheduledExecutionTime()


{
synchronized(lock)


{
returntimerTask==null?0:timerTask.scheduledExecutionTime();//任务执行时间
}
}

}
DailyIterator类:
importjava.util.Calendar;
importjava.util.Date;


public
class
DailyIteratorimplementsScheduleIterator
{
privatefinalinthourOfDay,minute,second;
privatefinalCalendarcalendar=Calendar.getInstance();

publicDailyIterator(inthourOfDay,intminute,intsecond)


{
this(hourOfDay,minute,second,newDate());
}

publicDailyIterator(inthourOfDay,intminute,intsecond,Datedate)


{
this.hourOfDay=hourOfDay;
this.minute=minute;
this.second=second;
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE,minute);
calendar.set(Calendar.SECOND,second);
calendar.set(Calendar.MILLISECOND,0);
if(!calendar.getTime().before(date))


{
calendar.add(Calendar.DATE,-1);
}
}

publicDatenext()


{//获取下一个触发的时间点
calendar.add(Calendar.DATE,1);
returncalendar.getTime();
}

}

测试类:
importjava.text.SimpleDateFormat;

importjava.util.Date;

importorg.tiling.scheduling.Scheduler;
importorg.tiling.scheduling.SchedulerTask;
importorg.tiling.scheduling.examples.iterators.DailyIterator;

public
class
AlarmClock

{

privatefinalSchedulerscheduler=newScheduler();//调度器
privatefinalSimpleDateFormatdateFormat=
newSimpleDateFormat("ddMMMyyyyHH:mm:ss.SSS");
privatefinalinthourOfDay,minute,second;//每天触发的时间点

publicAlarmClock(inthourOfDay,intminute,intsecond)


{
this.hourOfDay=hourOfDay;
this.minute=minute;
this.second=second;
}

publicvoidstart()


{
scheduler.schedule(newSchedulerTask()


{
publicvoidrun()


{
soundAlarm();
}
privatevoidsoundAlarm()


{
System.out.println("Wakeup!"+
"It's"+dateFormat.format(newDate()));
//Startanewthreadtosoundanalarm
}
},newDailyIterator(hourOfDay,minute,second));//通过迭代器模式迭代遍历得到后面一系列的时间点
}

publicstaticvoidmain(String[]args)


{
AlarmClockalarmClock=newAlarmClock(22,5,0);
alarmClock.start();
}
}
参考资料
Scheduling recurring tasks in Java applications