JAVA技巧(Java定时执行任务的实现方法) 定时执行任务的三种方法

原文:http://www.cnblogs.com/seaven/archive/2009/07/10/1520536.html


1 )java.util.Timer.   
2 )ServletContextListener.   
3 )org.springframework.scheduling.timer.ScheduledTimerTask   
1 )java.util.Timer   
  这个方法应该是最常用的,不过这个方法需要手工启动你的任务:   
Timer timer
= new  Timer();   
timer.schedule(
new  ListByDayTimerTask(), 10000 , 86400000 );   
这里的ListByDayTimerTask类必须extends TimerTask里面的run()方法。   
2 )ServletContextListener   
这个方法在web容器环境比较方便,这样,在web server启动后就可以   
自动运行该任务,不需要手工操作。   
将ListByDayListener 
implements  ServletContextListener接口,在   
contextInitialized方法中加入启动Timer的代码,在contextDestroyed   
方法中加入cancel该Timer的代码;然后在web.xml中,加入listener:   
< listener >    
< listener - class > com.sysnet.demo.util.MyTimerTask </ listener - class >    
</ listener >    
3 )org.springframework.scheduling.timer.ScheduledTimerTask   
  如果你用spring,那么你不需要写Timer类了,在schedulingContext
- timer   
.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 id = " timer "   class = " org.springframework.scheduling.timer.TimerFactoryBean " >    
< property name = " scheduledTimerTasks " >    
< list >    
< ref local = " MyTimeTask1 " />    
</ list >    
</ property >    
</ bean >    
< bean id = " MyTimeTask "   class = " com.qq.timer.ListByDayTimerTask " />    
< bean id = " MyTimeTask1 "   class = " org.springframework.scheduling.timer.ScheduledTimerTask " >    
< property name = " timerTask " >    
< ref bean = " MyTimeTask " />    
</ property >    
< property name = " delay " >    
< value > 10000 </ value >    
</ property >    
< property name = " period " >    
< value > 86400000 </ value >    
</ property >    
</ bean >    
</ beans >    
下面给出方法2的一个例子供大家参考:   
  Java代码:   
  
import  java.util.Timer;   
import  javax.servlet.ServletContextEvent;   
import  javax.servlet.ServletContextListener;   
public   class  MyTimerTask  implements  ServletContextListener{   
private  Timer timer  =   null ;   
@Override  
public   void  contextDestroyed(ServletContextEvent event) {   
//  TODO Auto-generated method stub   
timer.cancel();   
event.getServletContext().log(
" 定时器销毁 " );   
System.out.println(
" 停止备份程序…… " );   
}   
@Override  
public   void  contextInitialized(ServletContextEvent event) {   
// 在这里初始化监听器,在tomcat启动的时候监听器启动,考试,大提示可以在这里实现定时器功能   
timer  =   new  Timer( true );   
event.getServletContext().log(
" 定时器已启动 " ); // 添加日志,可在tomcat日志中查看到   
timer.schedule( new  exportHistoryBean(event.getServletContext()), 0 , 5 * 1000 ); // 调用 exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;   
}   
}   
import  java.util.Calendar;   
import  java.util.TimerTask;   
import  javax.servlet.ServletContext;   
public   class  exportHistoryBean  extends  TimerTask   
{   
private   static   final   int  C_SCHEDULE_HOUR  =   0 ;   
private   static   boolean  isRunning  =   false ;   
private  ServletContext context  =   null ;   
public  exportHistoryBean(ServletContext context)   
{   
this .context  =  context;   
}   
@Override  
public   void  run()   
{   
Calendar c 
=  Calendar.getInstance();   
if ( ! isRunning)   
{   
if (C_SCHEDULE_HOUR  ==  c.get(Calendar.HOUR_OF_DAY))   
{   
isRunning 
=   true ;   
context.log(
" 开始执行指定任务 " );   
isRunning 
=   false ;   
context.log(
" 指定任务执行结束 " );   
}   
else   
{   
context.log(
" 上一次任务执行还未结束 " );   
}   
}   
}   
}   
web.xml里加入一下代码:   
< listener >    
< listener - class > com.sysnet.demo.util.MyTimerTask </ listener - class >    
</ listener >   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值