java timer的使用_java Timer 使用小结

Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。

任务的调用通过起的子线程进行执行。

java.util.Timer

java.util.TimerTask

一、调用方法:

(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务

(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

void java.util.Timer.cancel():终止该Timer

boolean java.util.TimerTask.cancel():终止该TimerTask

可以为每个Timer指定多个TimerTask

虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。

对于该种需求,可通过Quartz来进行实现

二、方法名称schedule()和scheduleAtFixedRate()两者的区别

当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。

调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。

<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次

<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period

三、示例

(1)

/**

* 第一种方法:设定多长时间(毫秒)后执行任务*/

public static voidtimer1() {

final StopWatch watch= newStopWatch();

watch.start();

Timer timer= newTimer();/*void java.util.Timer.schedule(TimerTask task, long delay)*/timer.schedule(newTimerTask() {public voidrun() {

watch.stop();

System.out.println("-------任务执行--------");

System.out.println(watch.getTime());

}

},2000);//delay=2000毫秒 后执行该任务

}

(2)

/**

* 第二种方法:设定某个时间执行任务

*/

public static void timer2() {

Calendar calendar = new GregorianCalendar();

calendar.add(Calendar.MINUTE, 1);

calendar.set(Calendar.SECOND, 0); // 一分钟后执行

Timer timer = new Timer();

/* void java.util.Timer.schedule(TimerTask task, Date time) */

timer.schedule(new TimerTask() {

@Override

public void run() {

System.out.println("-------任务执行--------");

}

}, calendar.getTime());

}

(3)

/**

* 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行

*/

public static void timer3() {

Timer timer = new Timer();

final StopWatch watch = new StopWatch();

watch.start();

System.out.println(Thread.currentThread().getName());

/*

* void java.util.Timer.schedule(TimerTask task, long delay, long

* period)

*/

timer.schedule(new TimerTask() {

public void run() {

/* 子线程进行任务的执行 */

System.out.println(Thread.currentThread().getName());

System.out.println("-------设定要指定任务--------");

watch.suspend();

System.out.println(watch.getTime());

watch.reset();

watch.start();

}

}, 1000, 1000);

}

(4)

/**

* 固定延迟peroid时间后执行;peroid时间不是以任务执行完的时间为计算起点(某次任务执行完成后,经过peroid时间后再次调用[不是这样的])。

* 而是每隔peroid时间调用任务一次。当任务执行的时间小于peroid时间,可以保证每隔peroid时间调用一次。

* 当任务的执行时间大于peroid时间时,从现象上看:任务一执行完,就会立刻进入下一次任务的执行

*/

public static void timer3a() {

Timer timer = new Timer();

final StopWatch watch = new StopWatch();

watch.start();

timer.schedule(new TimerTask() {

Integer i = 1;

public void run() {

System.out.println(watch.getTime());

System.out.println("########第" + i + "次执行开始########");

try {

Thread.sleep(400);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("########第" + i + "次执行结束########");

i++;

watch.reset();

watch.start();

}

}, 1000, 500);

}

period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒

打印日志信息:

1000

########第1次执行开始########

########第1次执行结束########

109

########第2次执行开始########

########第2次执行结束########

93

########第3次执行开始########

########第3次执行结束########

93

########第4次执行开始########

########第4次执行结束########

93

########第5次执行开始########

########第5次执行结束########

93

########第6次执行开始########

########第6次执行结束########

93

########第7次执行开始########

########第7次执行结束########

93

########第8次执行开始########

当将Thread.sleep(400);修改为Thread.sleep(600)时:

打印日志信息:

1000

########第1次执行开始########

########第1次执行结束########

0

########第2次执行开始########

########第2次执行结束########

0

########第3次执行开始########

########第3次执行结束########

0

########第4次执行开始########

########第4次执行结束########

0

########第5次执行开始########

(5)

/**

* 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行

* 每天中午12点都执行一次*/

public static voidtimer4() {

Calendar calendar=Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, 12); //控制时

calendar.set(Calendar.MINUTE, 0); //控制分

calendar.set(Calendar.SECOND, 0); //控制秒

Date time= calendar.getTime(); //得出执行任务的时间,此处为今天的12:00:00

Timer timer= newTimer();/*void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)*/timer.schedule(newTimerTask() {public voidrun() {

System.out.println("-------设定要指定任务--------");

}

}, time,1000 * 60 * 60 * 24);//这里设定将延时每天固定执行

}

(6)

/**

* 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。

* timer.schedule和timer.scheduleAtFixedRate的区别:

* (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次

* (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period*/

public static voidtimer5() {

Timer timer= newTimer();/*void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)*/timer.scheduleAtFixedRate(newTimerTask() {public voidrun() {

System.out.println("-------设定要指定任务--------");

}

},1000, 500);

}

转:http://blog.csdn.net/eg366/article/details/11836017

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值