欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java定时任务的实现

程序员文章站 2022-05-21 19:04:44
...
    java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。
    一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。
java.util.Timer timer = new java.util.Timer(true); 
// true 说明这个timer以daemon方式运行(优先级低, 程序结束timer也自动结束),注意,javax.swing 包中也有一个Timer类,如果import中用到swing包,要注意名字的冲突。 
  
TimerTask task = new TimerTask() { 
   public void run() { 
     ... //每次需要执行的代码放到这里面。 
   } 
}; 
  
//以下是几种调度task的方法: 
  
timer.schedule(task, time); 
// time为Date类型:在指定时间执行一次。 
  
timer.schedule(task, firstTime, period); 
// firstTime为Date类型,period为long 
// 从firstTime时刻开始,每隔period毫秒执行一次。 
  
timer.schedule(task, delay) 
// delay 为long类型:从现在起过delay毫秒执行一次 
  
timer.schedule(task, delay, period) 
// delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。 

java.util.Timer timer = new java.util.Timer(true); 
// true 说明这个timer以daemon方式运行(优先级低, 程序结束timer也自动结束),注意,javax.swing包中也有一个Timer类,如果import中用到swing包,要注意名字的冲突。 

TimerTask task = new TimerTask() { 
   public void run() { 
     ... //每次需要执行的代码放到这里面。 
   } 
}; 

//以下是几种调度task的方法: 

timer.schedule(task, time); 
// time为Date类型:在指定时间执行一次。 

timer.schedule(task, firstTime, period); 
// firstTime为Date类型,period为long 
// 从firstTime时刻开始,每隔period毫秒执行一次。 

timer.schedule(task, delay) 
// delay 为long类型:从现在起过delay毫秒执行一次。 

timer.schedule(task, delay, period) 
// delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。


依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。
专业的开源工具可参考Quartz:http://www.opensymphony.com/quartz/
Java Web版
MyListener:
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {
  private Timer timer = null;
  public void contextInitialized(ServletContextEvent event) {
    timer = new Timer(true);//true设置定时器为守护线程,当此程序只剩下守护线程时,JVM退出
    //设置任务计划,启动和间隔时间
    timer.schedule(new MyTask(), 0, 86400000);
  }

  public void contextDestroyed(ServletContextEvent event) {
    timer.cancel();
  }
  
}


MyTask:
import java.util.TimerTask;
public class MyTask extends TimerTask {
  public void run() {
    // System.out.println("call at " + (new Date()));
    // TODO 此处添加具体任务代码
  }

}


web.xml配置:
<listener>
    <listener-class>com.fastunit.samples.listener.MyListener</listener-class>
</listener>


Java版
下面是一个完整的例子,由两个类组成,一个定制任务,一个调用java.util.Timer

定制任务:
import java.util.TimerTask;

public class TimeTask extends TimerTask {
	@Override
	public void run() {
		System.out.println("running");
	}
}


调用java.util.Timer:
本例中将定时任务设定为守护线程,马上开始执行,每个1000ms重复执行,5s后主线程结束,由于是守护线程,故随着主线程的结束,定时任务也结束。
import java.util.Timer;

public class TimerTest {
	public static void main(String[] args) {
		Timer timer = new Timer(true);
		timer.schedule(new TimeTask(), 0,1000);
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
相关标签: java