定时器学习总结.docx
- 文档编号:2392794
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:13
- 大小:47.98KB
定时器学习总结.docx
《定时器学习总结.docx》由会员分享,可在线阅读,更多相关《定时器学习总结.docx(13页珍藏版)》请在冰豆网上搜索。
定时器学习总结
PICC电话营销系统
Java定时器文档
2014年4月
关于本文档
主题
PICC电销系统核心技术文档
说 明
本文档主要说明电话营销系统核心技术
适用对象
PICC电话营销项目组
修订历史
版本
章节
类型
日期
作者
说明
说明:
类型-创建(C)、修改(U)、删除(D)、增加(A);
评审记录
角色
签名
日期
说明
目录
1前言1
1.1文档目的1
1.2适用范围1
1.3术语定义1
2Javaweb定时器1
2.1定时器分类1
2.2java.util.Timer1
2.2.1用法1
2.2.2原理2
2.2.3核心代码3
2.3Springtask4
2.3.1配置4
2.4Quartz定时器5
2.4.1作业6
2.4.2触发器6
2.4.3Cron触发器7
2.4.4配置实例8
2.5定时器总结10
2.5.1停止定时器10
2.5.2注意事项11
1前言
文档目的
本文详细介绍javaweb中定时器的实现方式,方便以后开发人员开发定时任务使用。
适用范围
本文档只适用电销系统项目的开发人员阅读。
术语定义
2Javaweb定时器
定时器分类
现的技术上来分类,目前主要有三种技术(或者说有三种产品):
1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。
使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。
一般用的较少,这篇文章将不做详细介绍。
2.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
3.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。
java.util.Timer
Timer是JDK中的定时调度类,主要用来定时触发任务。
用法
Timer是调度控制器,TimerTask是可调度的任务:
publicclassTestTimerTaskextendsTimerTask{
@Override
publicvoidrun(){
System.out.println(newDate());
}
}
调度过程:
publicclassTimerRunner{
publicstaticvoidmain(String[]args){
Timertimer=newTimer();
timer.schedule(newTestTimerTask(),5000L);
}
}
原理
其基本处理模型是单线程调度的任务队列模型,Timer不停地接受调度任务,所有任务接受Timer调度后加入TaskQueue,TimerThread不停地去TaskQueue中取任务来执行。
从图上不难看出,这就是生产者--消费者模型的一种特例:
多生产者,单消费者模型。
此种消息队列实现方式在浏览器中的编程模型中也有类似的实现,javascript中的定时执行函数setTimeout(expression,milliseconds)也是基于此种原理实现的。
此种方式的不足之处为当某个任务执行时间较长,以致于超过了TaskQueue中下一个任务开始执行的时间,会影响整个任务执行的实时性。
为了提高实时性,可以采用多个消费者一起消费来提高处理效率,避免此类问题的实现。
核心代码
privatevoidmainLoop(){
while(true){
try{
TimerTasktask;
booleantaskFired;
synchronized(queue){
//Waitforqueuetobecomenon-empty
while(queue.isEmpty()&&newTasksMayBeScheduled)
queue.wait();
if(queue.isEmpty())
break;//Queueisemptyandwillforeverremain;die
//Queuenonempty;lookatfirstevtanddotherightthing
longcurrentTime,executionTime;
task=queue.getMin();
synchronized(task.lock){
if(task.state==TimerTask.CANCELLED){
queue.removeMin();
continue;//Noactionrequired,pollqueueagain
}
currentTime=System.currentTimeMillis();
executionTime=task.nextExecutionTime;
if(taskFired=(executionTime<=currentTime)){
if(task.period==0){//Non-repeating,remove
queue.removeMin();
task.state=TimerTask.EXECUTED;
}else{//Repeatingtask,reschedule
queue.rescheduleMin(
task.period<0?
currentTime-task.period
:
executionTime+task.period);
}
}
}
if(!
taskFired)//Taskhasn'tyetfired;wait
queue.wait(executionTime-currentTime);
}
if(taskFired)//Taskfired;runit,holdingnolocks
task.run();
}catch(InterruptedExceptione){
}
}
}
1.先获得队列锁,然后去TaskQueue中取TimerTask,然后去判断此队列为空且新任务可安排标记是打开的。
如果不满足,线程等待,将队列锁释放。
2.如果队列为空,那么跳出死循环。
3.取得队列中的下一个元素,并获得任务锁。
4.检查任务状态,如果任务状态为取消,那么直接取消,并跳过此轮循环。
5.得到任务的计划执行时间,并检查与当前时间的先后,如果当前时间已经到或者超过计划执行时间,那么置状态位为执行。
6.释放任务锁。
7.如果没有,线程等待执行时间和当前时间差。
8.释放队列锁
9.看任务是否可以执行标记,来确定是否执行任务
10反复从1开始
终止Timer线程
Springtask
Spring内部有一个task是Spring自带的一个设定时间自动任务调度task使用的时候很方便。
配置
首先要配置我们的spring.xml。
1、Web.xml中添加:
--指定Spring的配置文件-->
--
2、xmlns多加下面的内容:
xmlns:
task="http:
//www.springframework.org/schema/task"
3、然后xsi:
schemaLocation多加下面的内容:
http:
//www.springframework.org/schema/task
http:
//www.springframework.org/schema/task/spring-task-3.1.xsd
4、然后添加下面的内容
class="com.TestTasks"> scheduled-tasks> -- 每天1分钟运行一次,时间定义可网上找CRON表达式 --> scheduledref="testTasks"method="send" cron="00/1***? "/> scheduled-tasks> 5、创建普通的java类 publicclassTestTasks{ privateTimestamppreTime=null; publicvoidsend(){ System.out.println("sendstart...."+preTime); preTime=newTimestamp(System.currentTimeMillis()); System.out.println("sendend......"+preTime); } } Quartz定时器 Quartz是OpenSymphony提供了一个比较完美的任务调度解决方案。 Quartz是个开源的作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。 Quartz中有两个基本概念: 作业和触发器。 作业是能够调度的可执行任务,触发器提供了对作业的调度。 作业 实现org.quartz.job接口,实现接口方法 publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException,在这个方法实现具体的作业任务。 触发器 触发器可以实现对任务执行的调度。 简单触发器: publicvoidtask()throwsSchedulerException{ //InitiateaScheduleFactory SchedulerFactoryschedulerFactory=newStdSchedulerFactory(); //Retrieveaschedulerfromschedulefactory Schedulerscheduler=schedulerFactory.getScheduler(); //currenttime longctime=System.currentTimeMillis();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定时器 学习 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)