java定时器Timer的使用

来源:互联网 发布:老a淘宝工具箱 编辑:程序博客网 时间:2024/05/01 11:58

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 去执行即可。




0 0
原创粉丝点击