`
dato0123
  • 浏览: 914713 次
文章分类
社区版块
存档分类
最新评论

一个java定时器框架

 
阅读更多

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
{//被调度器不断调度执行的任务

finalObject
lock=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

分享到:
评论

相关推荐

    Java定时器框架(Quartz)

    有助于你快速的查找您要使用的类对象及其方法。

    Java 应用程序中定时执行任务的定时器框架

    一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需要的计划任务类型。在本资源中包含框架构造过程和java源代码,欢迎下载...

    java定时器

    可以利用springmvc框架,加入定时器,很好用

    Java开发的一个简约后台管理系统源码.zip

    项目简介:Java开发的一个简约后台管理系统 1.需求定义:外包项目如雨后春笋,开发工期被迫压缩,为了开发人员专注开发项目业务,早点下班能陪老婆、孩子。 2.产品定位: 简约后台管理系统 3.项目特点:此项目代码...

    java Spring OpenSymphony的Quartz定时器的时间设置

    java Spring OpenSymphony的Quartz定时器的时间设置

    java轻松实现—定时任务

    只需要在web.xml文件中添加监听器listener,然后加入附件中的文件,并将lstener指向所添加的文件TimerTaskListener,定时任务的研发便可轻松搞定!

    采用Scheduled注释的方式实现Spring定时器的功能.zip

    本工程用于研究如何在Spring框架中采用Scheduled注释的方式实现Spring定时器的功能 本工程编码方式:UTF-8 相关博客:http://blog.csdn.net/gaohuanjie/article/details/43559167

    采用XML配置的方式实现Spring定时器的功能.zip

    本工程用于研究如何在Spring框架中采用XML配置的方式实现Spring定时器的功能 本工程编码方式:UTF-8 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43563245

    quartz入门到精通

    定时器框架学习资料,入门手册,新手专用!帮你快速入门开发搭建自己的定时器框架环境

    Java商城后台管理系统,接私活利器.zip

    定时器:Quartz 数据库连接池:Druid 日志管理:logback 页面交互:layui 下拉框:bootstrap-select 文件上传:Bootstrap File Input 热部署 jrebel 验证框架 hibernate-validator Java商城后台管理系统 技术选型 ...

    定时器之Saturn实战

    定时器框架Saturn,VIP使用的,内容包含对定时器的介绍,以及Saturn的使用例子

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    Java quartz jar包

    Java quartz 定时器调度框架,用于Java实现定时调度功能。

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    Java洗衣店智能管理系统源码.zip

    Java洗衣店智能管理系统:实现对洗衣店的一体化管理,集前台衣物管理系统、会员卡管理系统、 财务报表系统等功能于一身,提高洗衣店的管理效率和服务水平。 技术选型: 核心框架:Spring Boot 2.3 安全框架:...

Global site tag (gtag.js) - Google Analytics