定时器学习总结.docx

上传人:b****1 文档编号:2392794 上传时间:2022-10-29 格式:DOCX 页数:13 大小:47.98KB
下载 相关 举报
定时器学习总结.docx_第1页
第1页 / 共13页
定时器学习总结.docx_第2页
第2页 / 共13页
定时器学习总结.docx_第3页
第3页 / 共13页
定时器学习总结.docx_第4页
第4页 / 共13页
定时器学习总结.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

定时器学习总结.docx

《定时器学习总结.docx》由会员分享,可在线阅读,更多相关《定时器学习总结.docx(13页珍藏版)》请在冰豆网上搜索。

定时器学习总结.docx

定时器学习总结

 

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的配置文件-->

 

  contextConfigLocation

  /WEB-INF/config/spring*.xml

  

--/WEB-INF/applicationContext.xml-->

 

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();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1