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/
[size=large][b]Java Web版[/b][/size]
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>


[size=large][b]Java版[/b][/size]
下面是一个完整的例子,由两个类组成,一个定制任务,一个调用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();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值