java定时打印,自己写的,望大师指教
import java.util.Timer;
import java.util.TimerTask;
public class TimerUtil2 {
public static void main(String[] args) {
Timer t=doSeconds();
System.out.println(t);
System.out.println("main:"+Thread.currentThread().getName());
//运行线程和 TimerTask不是同一线程,可停止
// t.cancel();
// System.out.println(0%20==0);
// System.out.println(1%20==0);
}
public static Timer doSeconds() {
final Timer timer = new Timer();
// schedule() 这个方法有三个参数,第一个参数是要运行的代码,第二个参数是从什么时候开始运行,第三个参数是每隔多久在运行一次。
timer.schedule(new TimerTask() {
int a=1;
int maxSec=5;
@Override
public void run() {
// Date dd = new Date();
// System.out.println(dd);
if (a>maxSec) {
System.out.println("run:"+Thread.currentThread().getName());
System.out.println("大于最大设定秒数,计时结束");
timer.cancel();
return;
}
if (a%20==0) {
System.out.println(a);
}else {
System.out.print(a+" ");
}
a++;
}
},1000,1000);
return timer;
}
}
Timer类的方法
schedule(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定延迟执行。
schedule(TimerTask task, long delay, long period)
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
schedule(TimerTask task, Date time)
安排在指定的时间执行指定的任务。
schedule(TimerTask task, long delay)
安排在指定延迟后执行指定的任务。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
区别详见文档
---------------------------------------------------------
每天指定时刻任务
可参考:http://www.open-open.com/lib/view/open1338175095183.html
这个例子有点不完善,应在listener的destory中终止timer
public class TimerManager {
//时间间隔
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
public TimerManager() {
Calendar calendar = Calendar.getInstance();
/*** 定制每日2:00执行方法 ***/
calendar.set(Calendar.HOUR_OF_DAY, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date=calendar.getTime(); //第一次执行定时任务的时间
//如果第一次执行定时任务的时间 小于 当前的时间
//此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (date.before(new Date())) {
date = this.addDay(date, 1);
}
Timer timer = new Timer();
NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(task,date,PERIOD_DAY);
}
// 增加或减少天数
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
}
在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后
发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况
发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。
public class NFDFlightDataTimerTask extends TimerTask {
private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);
@Override
public void run() {
try {
//在这里写你要执行的内容
} catch (Exception e) {
log.info("-------------解析信息发生异常--------------");
}
}
}
public class NFDFlightDataTaskListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
new TimerManager();
}
public void contextDestroyed(ServletContextEvent event) {
}
}
然后要在web.xml里面配置监听器
<listener>
<listener-class>
com.listener.NFDFlightDataTaskListener
</listener-class>
</listener>
----------------------------------
还有一个例子,比较简洁
http://www.blogjava.net/fastunit/archive/2008/02/15/180116.html
本例依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。
MyListener:
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 );
// 设置任务计划,启动和间隔时间
timer.schedule( new MyTask(), 0 , 86400000 );
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
}
}
MyTask:
public class MyTask extends TimerTask {
public void run() {
// System.out.println("call at " + (new Date()));
// TODO 此处添加具体任务代码
}
}
web.xml配置:
< listener-class > com.fastunit.samples.listener.MyListener </ listener-class >
</ listener >