1定时器的作用
在实际的开发中,如果项目中需要定时执行或者需要重复执行一定的工作,定时器显现的尤为重要。
例如,公司的考勤系统---刷卡
财务的审查,入账,报表都会需要定时器
当然如果我们不了解定时器就会用线程去实现,例如:
package org.lzstone.action
public class FinanceAction extends Thread{
private Date date;
public void run{
try{
while(true){
Thread.sleep((int)(Math.random()*1000));
date = new Date();
//定时执行任务
}
}catch(Exception e){
e.printStackTrace();
}
}
}
自己实现定时器的工作很复杂,如果实现不好占用内存过多,系统就此Over,所以处理定时执行或者重复执行的任务,定时器是很好的选择
2.java中常见的定时器
1)借助Java.util.Timer来实现
2)OpenSymphony社区提供的Quartz来实现
3.介绍Timer
利用Timer开发定时任务是主要分为两个步骤:
1)创建定时任务类
示例代码:
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
public void run(){
//执行的定时器任务
}
}
2)运行定时任务,运行定时任务分为两种方式:
2.1)程序直接启动
示例代码:
package org.lzstone.action
public class LzstoneMain{
.......
public void run(){
//执行定时器的任务
//创建实例
Timer timer = new Timer();
参数:
new LzstoneTimeTask()- 所要安排的任务。
0- 执行任务前的延迟时间,单位是毫秒。
1*1000- 执行各后续任务之间的时间间隔,单位是毫秒。
timer.schedule(new LzstoneTimeTask(),0,1*1000);
}
}
2.2)web监听方式
示例代码:
package org.lzstone.action
public class LzstoneMain implements ServletContextListener{
private Timer timer = null;
//初始化监听器,创建实例,执行任务
public void contextInitialized(ServletContextEvent event){
timer = new Timer();
timer.schedule(new LzstoneTimeTask(),0,1*1000);
}
//销毁监听器,停止执行任务
public void contextDestroyed(ServletContextEvent event){
//注意,在此计时器调用的计时器任务的 run 方法内调用此方法,就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务。
timer.cancel();
}
}
web.xml配置
<listener>
<listener-class>
org.lzstone.action.LzstoneMain
</listener-class>
</listener>
4. 介绍Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,可以用来创建简单或者复杂的定时任务,利用Quartz开发定时任务的步骤与Timer类
似。
利用Quartz开发定时任务是主要分为两个步骤:
1)创建定时任务类
示例代码:
package org.lzstone.action
public class LzstoneTimeTask implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException{
//执行的定时器任务
}
}
2)运行定时任务,运行定时任务分为两种方式:
2.1)程序直接启动,创建任务调度器及配置相应的任务计划
示例代码:
package org.lzstone.action
public class LzstoneMain{
private static Scheduler sched;
public static void run() throws Exception{
//创建LzstoneTimeTask的定时任务
JobDetail jobDetail = new JobDetail("lzstoneJob",sched.DEFAULT_GROUP,LzstoneTimeTask.class);
//目标 创建任务计划
CronTrigger trigger = new CronTrigger("lzstoneTrigger","lzstone","0 0 12 * * ?");
//0 0 12 * * ? 代表每天的中午12点触发
sched = new org.quartz.impl.StdSchedulerFactory().getScheduler();
sched.scheduleJob(jobDetail,trigger);
sched.start();
}
//停止
public static void stop() throws Exception{
sched.shutdown();
}
}
//执行
public class Main{
.............
public void run(){
LzstoneMain.run();
}
............
}
2.2)web监听方式
示例代码:
package org.lzstone.action
public class LzstoneMainListener implements ServletContextListener{
private Timer timer = null;
//初始化监听器,创建实例,执行任务
public void contextInitialized(ServletContextEvent event){
LzstoneMain.run();
}
//销毁监听器,停止执行任务
public void contextDestroyed(ServletContextEvent event){
LzstoneMain.stop();
}
}
web.xml配置
<listener>
<listener-class>
org.lzstone.action.LzstoneMainListener
</listener-class>
</listener>
5.对比
Timer方式实现定时器,原理简单,实现方便,在执行简单的任务比较方便,不足之处是无法确定执行时间,并且依赖性比较强,必须继承指定的类
Quartz方式实现定时器,方便,清晰指定启动时间,定时参数比较灵活,容易实现比较复杂的定时任务,不足之处是需要实现特定接口,加载其框架
两种方式各有优缺点,在特定场合可以根据其特点选择使用。
6.Spring定时任务
Spring定时任务对Timer与Quartz都提供了支持,并且实现步骤基本一样
首先配置Spring对Timer的支持
1.1 创建定时任务类
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
public void run(){
//执行的定时器任务
}
}
1.2 注册定时任务类,配置任务计划与任务调度器
在项目的WEB-INF下面创建TimerConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--注册定时执行任务实体-->
<bean id="lzstoneTimeTask" class="org.lzstone.action.LzstoneTimeTask"/>
<!--注册定时器信息-->
<bean id="taskInfo" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!--第一次执行任务前需要等待的时间,这里设置为3秒-->
<property name="delay">
<value>3000</value>
</property>
<!--设置任务的执行周期 这里设置为4秒-->
<property name="period">
<value>4000</value>
</property>
<!--设置具体执行的任务 这里设置为lzstoneTimeTask-->
<property name="timerTask">
<ref local="lzstoneTimeTask"/>
</property>
</bean>
<!--配置定时器任务的调度器-->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--注册定时器列表-->
<property name="scheduledTimerTasks">
<list>
<ref local="taskInfo"/>
........
</list>
</property>
</bean>
</beans>
1.3 web项目中的启动设置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/TimerConfig.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
配置Spring对Quartz的支持
2.1 创建定时任务类
package org.lzstone.action
public class LzstoneQuartzTask{
public void execute(){
//执行的定时器任务
}
}
2.2 注册定时任务类,配置任务计划与任务调度器
在项目的WEB-INF下面创建QuartzConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--注册定时执行任务实体-->
<bean id="lzstoneQuartzTask" class="org.lzstone.action.LzstoneQuartzTask"/>
<!--注册定时器信息-->
<bean id="taskInfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--指定要执行的定时任务类 这里是LzstoneQuartzTask-->
<property name="targetObject">
<ref local="lzstoneQuartzTask"/>
</property>
<!--指定定时器任务类要执行的方法名称 这里是execute-->
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
<!--配置定时器任务的调度器-->
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--声明要运行的实体-->
<property name="jobDetail">
<ref local="taskInfo"/>
</property>
<!--设置运行时间-->
<property name="cronExpression">
<value>0 0 12 * * ?</value>
</property>
</bean>
<!--注册监听器-->
<bean id="registerQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--注册定时器实体 集合-->
<property name="triggers">
<list>
<ref local="quartzTrigger"/>
</list>
</property>
</bean>
</beans>
2.3 web项目中的启动设置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/QuartzConfig.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
分享到:
相关推荐
555定时器应用 555定时器应用 555定时器应用
一种555定时器应用电路的OrCAD分析与设计方法.pdf
在IT领域,尤其是在系统编程和实时应用...总的来说,C/C++中的高性能定时器应用涉及到操作系统接口、标准库、硬件交互以及多线程和分布式设计等多个方面。理解和熟练运用这些技术,将有助于构建更加高效和可靠的系统。
《555定时器应用电路探索》 555定时器是一种极其通用的集成电路,自1971年推出以来,已经成为电子工程师的必备工具。它以其灵活性、易用性和广泛的用途,在各种电子项目中占据了一席之地。本资料集包含了50个555...
《数电实验555定时器应用:深入解析与Multisim仿真》 555定时器是一款极其灵活且广泛应用的集成电路,它在数字电子电路实验中占据着重要的地位。这款芯片由于其简单的结构和广泛的用途,使得学习者能够通过实践深入...
**CORTE-M3 定时器应用详解** 在嵌入式系统开发中,定时器是不可或缺的组件之一,尤其在基于ARM Cortex-M3处理器的系统中。Cortex-M3是ARM公司推出的一种低功耗、高性能的32位微控制器核心,广泛应用于各种嵌入式...
STM32定时器应用 STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计。在STM32中,定时器是一个非常重要的组件,它能够执行计数、定时、中断等功能,为系统提供精确的时间控制。本篇文章将深入...
在这个“c++定时器应用(源码)”中,我们可能看到一个利用定时器机制来实现功能的例子。`settimer`是Windows API中的一个函数,用于设置定时器,通常用于创建周期性的事件触发。下面我们将详细讨论C++中定时器的...
下面是一个简单的多媒体定时器应用示例: ```cpp #include LRESULT CALLBACK TimerProc(UINT idEvent, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) { // 这里编写定时器触发时执行的代码 printf("定时器...
这个压缩包中的"定时器应用"很可能包含了以下内容: 1. Linux内核定时器驱动程序源码:展示了如何设置硬件定时器和处理中断。 2. 用户空间应用程序示例:可能使用C或C++编写,演示了如何利用内核提供的定时器接口或...
在IT领域,定时器应用是一种常见且实用的技术,尤其在软件开发中,它扮演着重要的角色。VB(Visual Basic)是Microsoft开发的一种面向对象的编程语言,非常适合初学者和专业开发者构建桌面应用程序。在这个特定的...
### EM78P153定时器应用详解 #### 引言 EM78P153是一款由义隆电子生产的高性能单片机,广泛应用于各种电子设备中,特别是其内置的定时器功能,为时间相关的操作提供了强大的支持。本文将深入探讨EM78P153定时器的...
《555定时器应用软件详解》 555定时器是一种极其通用的集成电路,它在电子工程领域中有着广泛的应用。这款名为“555定时器应用软件”的程序,显然是专为帮助用户设计和模拟555定时器电路而开发的。作为一个强大的...
### 555定时器应用电路详解 #### 一、555定时器概述 555定时器是一种集成了模拟电路与数字逻辑电路特点的单片集成电路,它以其简单的结构和灵活的应用方式而在电子技术领域占据了一席之地。通过与外部电阻、电容等...
总结,MSP430单片机的定时器应用主要涉及定时器的工作模式配置、比较值设定、中断处理及电源管理等方面。通过熟练掌握这些知识,我们可以灵活地利用定时器实现各种复杂的嵌入式系统功能,例如LED闪烁只是其中一个...
总结起来,这个"protues 单片机定时器应用——数字时钟"项目,让我们深入了解了单片机定时器的工作原理和应用,以及如何结合Protues进行虚拟仿真测试。通过这样的实践,不仅可以提升我们的理论知识,也能增强动手...
本篇内容将深入探讨AVR微控制器中的定时器应用,这对于任何需要精确时间控制的项目都至关重要。 一、AVR定时器基础 在AVR微控制器中,定时器是一种硬件资源,能够以固定的时间间隔产生中断或进行计数。定时器的工作...
"PLC定时器应用教学设计(市级公开课)" 本教学设计旨在让中职三年级电子技术专业的学生掌握PLC定时器的应用,包括了解定时器的结构、作用和工作原理,掌握编程软件中定时器梯形图参数设置,学会任务程序的编写及实验...
STM32F10XX系列微控制器中的定时器是其核心功能之一,广泛应用于各种实时控制和时序处理。本文主要关注的是通用定时器(TIM2~5),这些定时器具有丰富的配置选项和灵活的使用方式,对于初学者来说可能需要深入理解...