`
fxly0401
  • 浏览: 144378 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java定时任务的实现

阅读更多
    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();
		}
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics