java定时器Timer的使用

时间:2022-09-13 21:28:39

1、构造方法

Timer timer = new Timer();

②定时器为守护进程

boolean flag=true;

Timer timer1 =new Timer(flag);

③指定定时器的名字,方便指定停止 

String name="TimerName2";

Timer timer2 =new Timer(name);

④指定定时器的名字,并指定为守护进程 

String name3="TimerName3";

Timer timer3 =new Timer(name3, flag);

2、方法

①延时delay时间后执行task

public void schedule(TimerTask task,long delay)
②指定时间执行task

public void schedule(TimerTask task,Date time)

③period:间隔周期  delay:执行延时周期 开始delay时间后间隔period执行task

public void schedule(TimerTask task, long delay,long period)

④间隔period时间,在指定firstTime时间执行

public void schedule(TimerTask task,Date firstTime,long period)
period:间隔周期  delay:执行延时周期 开始 delay时间后间隔period执行task

public void scheduleAtFixedRate(TimerTask task,long delay,long period)
间隔period时间,在指定firstTime时间执行

public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 

⑦定时器停止运行

public void cancel()
从这个计时器的任务队列中移除所有已取消的任务。

public int purge()
3、example
package com.assp.admin.web.controller;


import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class JobTestController extends TimerTask {


String jobName = "";


public JobTestController(String jobName) {
this.jobName = jobName;
}
@Override
public void run() {
System.out.println("go::::" + jobName);
}
public static void main(String[] args) {
Date t=new Date();
long tl=t.getTime();
Timer timer = new Timer();

boolean flag=true;
Timer timer1 =new Timer(flag);

String name="TimerName2";
Timer timer2 =new Timer(name);

String name3="TimerName3";
Timer timer3 =new Timer(name3, flag);

long delay1 = 1 * 1000;
long period1 = 1000;
// period1:间隔周期 delay1:执行延时周期
//从现在开始 1 秒钟之后,每隔 1 秒钟执行一次 job1
timer.schedule(new JobTestController("job1"), delay1, period1);
long delay2 = 2 * 1000;
long period2 = 2000;
// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 job2
timer.schedule(new JobTestController("job2"), delay2, period2);
timer1.schedule(new JobTestController("timer1"), delay2, period2);
//timer2.schedule(new JobTestController("timer2"), delay2, period2);
//timer3.schedule(new JobTestController("timer3"), delay2, period2);
timer1.cancel();
}
}
4、schedule与scheduleAtFixedRate区别

public static void main(String[] args) {
Timer timer = new Timer();
SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = null;
try {
d1 = fTime.parse("2016/09/02 17:12:00");
} catch (ParseException e) {
e.printStackTrace();
}
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("this is task you do6");
}
}, d1, 3 * 60 * 1000);
}

上面例子间隔时间是3分钟,指定开始时间是2006/09/02 14:10:00,如果我在14:17:00分执行这个程序,会立刻打印3次

  this is task you do6     //14:10

  this is task you do6     //14:13

  this is task you do6     //14:16

如果用schedule方法,相同参数条件下,在14:17:00执行,则立即执行一次,且下次的执行时间是14:20:00,而不是14:19:00

需要注意:scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果不同。上面是简单的例子,在实际的项目中,定时任务比较复杂,由于某种原因(如垃圾回

收或者其他后台活动)延迟了某次的执行,则scheduleAtFixedRate方法将快速连续的出现两次或更多的执行,从而使后续执行能力追赶上来;而schedule方法的后续执行也

将被延迟。所以,在长期的运行中,scheduleAtFixedRate执行的频率将整好是指定周期的倒数,schedule执行的频率一般要稍慢于指定周期倒数。


结论:scheduleAtFixedRate 效率总体上高于schedule

4、总结

Timer 的优点:简单易用

Timer 的缺点:

①. Timer是基于绝对时间的。容易受系统时钟的影响。 
②. 单线程。所有TimeTask可能会相关影响 
③. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。

Timer 实现任务调度的核心类:Timer 和 TimerTask。 Timer 负责设定 TimerTask 的起始与间隔执行时间。

Timer 的设计核心: TaskList 、TaskThread。Timer 将接收到的任务丢到自己的 TaskList 中,TaskList 按照 Task 的最初执行时间进行排序。TimerThread 在创建Timer时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread 被唤醒并执行该任务。之后 TimerThread 更新最近一个要执行的任务,继续休眠

Timer 使用:使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。