ScheduleIterator接口
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
importjava.util.Date;
publicinterfaceScheduleIterator
{
publicDatenext();//获取下一个触发的时间点
}
Scheduler类
importjava.util.Date;
importjava.util.Timer;
importjava.util.TimerTask;
publicclassScheduler
{
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;
publicabstractclassSchedulerTaskimplementsRunnable
{//被调度器不断调度执行的任务
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;
publicclassDailyIteratorimplementsScheduleIterator{
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;
publicclassAlarmClock
{
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
分享到:
相关推荐
有助于你快速的查找您要使用的类对象及其方法。
一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需要的计划任务类型。在本资源中包含框架构造过程和java源代码,欢迎下载...
可以利用springmvc框架,加入定时器,很好用
项目简介:Java开发的一个简约后台管理系统 1.需求定义:外包项目如雨后春笋,开发工期被迫压缩,为了开发人员专注开发项目业务,早点下班能陪老婆、孩子。 2.产品定位: 简约后台管理系统 3.项目特点:此项目代码...
java Spring OpenSymphony的Quartz定时器的时间设置
只需要在web.xml文件中添加监听器listener,然后加入附件中的文件,并将lstener指向所添加的文件TimerTaskListener,定时任务的研发便可轻松搞定!
本工程用于研究如何在Spring框架中采用Scheduled注释的方式实现Spring定时器的功能 本工程编码方式:UTF-8 相关博客:http://blog.csdn.net/gaohuanjie/article/details/43559167
本工程用于研究如何在Spring框架中采用XML配置的方式实现Spring定时器的功能 本工程编码方式:UTF-8 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43563245
定时器框架学习资料,入门手册,新手专用!帮你快速入门开发搭建自己的定时器框架环境
定时器:Quartz 数据库连接池:Druid 日志管理:logback 页面交互:layui 下拉框:bootstrap-select 文件上传:Bootstrap File Input 热部署 jrebel 验证框架 hibernate-validator Java商城后台管理系统 技术选型 ...
定时器框架Saturn,VIP使用的,内容包含对定时器的介绍,以及Saturn的使用例子
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Java quartz 定时器调度框架,用于Java实现定时调度功能。
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Java洗衣店智能管理系统:实现对洗衣店的一体化管理,集前台衣物管理系统、会员卡管理系统、 财务报表系统等功能于一身,提高洗衣店的管理效率和服务水平。 技术选型: 核心框架:Spring Boot 2.3 安全框架:...