Java定时器

来源:互联网 发布:局域网 9000端口 编辑:程序博客网 时间:2024/05/29 11:48

今天研究了一下Java的定时器,下面简单说一下并给出案例
## 简介 ##
定时器顾名思义就是起到定时作用,定时执行任务,启动一个定时器,其底层就会启动一个线程,你也可以理解,定时器是就是定时启动一个线程去执行你所要执行的任务!!
要了解定时器,做要了解jdk带的“Timer”和“TimerTask”,

  • Timer:我理解是定时器的工具,起到定时作用,和你所要执行的内容无关。
  • TimerTask是一个接口共实现,这个接口底层又实现了线程接口Runnable,所有必须重写 run方法, 这也印证了上面我说的定时器是启动线程执行任务!

    Timer主要有几个构造方法:
    1.time.schedule(TimerTask task, Date time);参数 task是TimerTask对象,就是你所要执行的任务, time 是Date对象,是启动时间!
    2.time.schedule(TimerTask task, Date time,Long long); 是TimerTask对象,就是你所要执行的任务, time 是Date对象,是启动时间! long 是Long对象,是循环间隔时间!
    3.boolean cancel():用于取消计时器任务。
    4.scheduleAtFixedRate(TimerTask task, Date time, long long):是TimerTask对象,就是你所要执行的任务, time 是Date对象,是启动时间! long 是Long对象,是循环间隔时间!
    注意:
    time.schedule(TimerTask task, Date time,Long long)和scheduleAtFixedRate(TimerTask task, Date time, long long) 这两个构造方法看是一样,但是内部不一样:
    schedule(TimerTask task, Date time,Long long):如果执行任务的时间没有被延时,那么下一次执行时间参考上一次任务的“开始”时间来计算
    scheduleAtFixedRate(TimerTask task, Date time, long long):如果执行任务的时间没有被延时,那么下一次执行时间参考上一次任务的“结束”时间来计算
    简单定时任务案例:

package Thread;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class Test3 {private static Timer time=new Timer();//初始化定时器工具 public static void main(String[] args) {    try {        MyTask1 mt=new MyTask1();//初始化定时任务        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String strTime="2017-09-01 15:22:00";        Date date=sdf.parse(strTime);//设置定时器起始时间        time.schedule(mt, date);    } catch (Exception e) {        e.printStackTrace();    }}}/** * 定时任务 * @author user * */class MyTask1 extends TimerTask{    /**     * 所要定时的内容写在run里面     */    @Override    public void run(){        try {            System.out.println("运行了MyTASK 开始运行时间:"+new Date().toLocaleString());            Thread.sleep(3000);//暂停3秒            System.out.println("运行了MyTASK 结束运行时间:"+new Date().toLocaleString());        } catch (Exception e) {            e.printStackTrace();    }}}

控制台打印结果:
这里写图片描述
可以看出来运行时间和设定时间一致!

循环案例

package Thread;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class Test1 {   private static Timer time=new Timer();   public static void main(String[] args) {    try {            MyTask mt= new MyTask();            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            String strTime="2017-09-01 16:19:00";            Date date=sdf.parse(strTime);            time.schedule(mt,date,2000);//循环    } catch (Exception e) {        e.printStackTrace();    }}static class MyTask extends TimerTask{    @Override    public void run(){        try {            System.out.println("运行了MyTASK 开始运行时间:"+new Date().toLocaleString());        } catch (Exception e) {            e.printStackTrace();        }    }}}

这里写图片描述

可以看出来每隔两秒执行一次

原创粉丝点击