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
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
);
//
设置任务计划,启动和间隔时间
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
>