java 定时执行任务

来源:互联网 发布:金坷垃 知乎 编辑:程序博客网 时间:2024/05/01 23:28
最简单的方法:
packagecom.sy.test; 
importjava.util.Timer;
importjava.util.TimerTask; 
publicclass ScheduleRun { 
    Timer timer; 
    publicScheduleRun(intdelaytime) {
        timer = newTimer(); 
        timer.schedule(newScheduleRunTask(), 0, delaytime * 1000);
    } 
  
    publicvoid stop() { 
        timer.cancel(); 
    } 
  
    classScheduleRunTask extendsTimerTask { 
        publicvoid run() { 
                System.out.println("过了2秒"); 
        } 
    } 
  
    publicstatic void main(String[] args) { 
        newScheduleRun(2); 
    } 
}
另外:
JAVA技巧(Java定时执行任务的实现方法)2009年02月07日 星期六 10:36定时执行任务的三种方法:   
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>   
  

参考:
http://www.cnblogs.com/seaven/archive/2009/07/10/1520536.html
http://www.cnblogs.com/shiyangxt/archive/2009/01/25/1380815.html
原创粉丝点击