zoukankan      html  css  js  c++  java
  • java Timer定时器管理类

    1.java timer类,定时器类。启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定时操作所执行的动作,后一个参数是豪秒,代表间隔多久执行一次。
    2.TimerTask类,java.util.TimerTask,具体定时执行的操作。里面有个run方法,和线程run方法一样(就是线程)。
    5.Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
    TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
    6.Timer可以定时多次执行任务,也可以让Timer在固定时间只执行一次。全都是Timer.sehedule()方法,这是重载方法,可以传多个参数。
    timer.scheduleAtFixedRate(timerTask, firstTime, period);以固定间隔时间段多次执行。
    timer.schedule(timerTask, firstTime);在固定时间执行一次。
    7.Timer和TimerTask之间的关系,Timer是TimerTask的管理工具,一个Timer可以对应多个TimerTask,启动多个TimerTask,并管理他们的执行。
    既然是一个Timer可以绑定多个TimerTask,我们就在代码里可以封装一个单例类,封装Timer进去。然后用这一个Timer,去调度和管理所有的TimerTask
    timerService.startTimerTask(new AlarmTimerTask(), 3 * 1000, 1 * 1000);
    timerService.startTimerTask(new AlarmTimerTask2(), 3 * 1000, 1 * 1000);
    8.static方法和普通方法没有任何区别,static方法里面的代码,可以随便new一个对象,前提是在代码运行期间。不要再static代码块里执行这个static方法就行。其他运行期间才调用的static方法,可以里面随便包含普通代码。
    如: public static TimerService getInstance() {
    Timer timer = new Timer();
    return instance;
    }
    2.java util包是个好用的包,里面有logging日志工具类,还有properties配置文件,timer类。所以确实是个工具包,脸面很多工具类。
    java.util,logging
    java.util.properties
    java.util.timer

    4.简单的一个例程:
    import java.util.Timer;
    import java.util.TimerTask;

    /**
    * Simple demo that uses java.util.Timer to schedule a task to execute
    * once 5 seconds have passed.
    */

    public class Reminder {
    Timer timer;

    public Reminder(int seconds) {
    timer = new Timer();
    timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
    public void run() {
    System.out.println("Time's up!");
    timer.cancel(); //Terminate the timer thread
    }
    }

    public static void main(String args[]) {
    System.out.println("About to schedule task.");
    new Reminder(5);
    System.out.println("Task scheduled.");
    }
    }

    5.还有一种方法可以指定任务的执行时间,如下例,指定任务在11:01 p.m.执行:
    //Get the Date corresponding to 11:01:00 pm today.
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 1);
    calendar.set(Calendar.SECOND, 0);
    Date time = calendar.getTime();

    timer = new Timer();
    timer.schedule(new RemindTask(), time);
    2.终止Timer线程
    默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:


    调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里。
    让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
    当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。

    第二种方法:让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
    如果设成daemon,那么当main线程 结束的时候,程序只剩下timer这个daemon线程,于是程序不会等timer线程执行task就终止了。
    当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。


    3.注意:一个Timer仅仅对应一个线程,并不是多个线程,而且Timer本身就是一个线程,。即使是间隔时间多次执行,也是同一个线程。一个Timer绑定的多个TimerTask都是运行在Timer这一个线程里的。可以通过java代码测试一下,Timer启动俩TimerTask,在每个TimerTask里输出当前线程的名字thread.currentThread.getName(),肯定是一样的。多个TimerTask是跑在一个Timer线程里的,且这个线程名字就叫Timer-X


    二。java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。


    1什么叫匿名内部类?new对象时候,直接写出来实现代码的类,就是创建匿名类
    TimerTask task = new TimerTask() {
    public void run() {
    ... //每次需要执行的代码放到这里面。
    }
    };

  • 相关阅读:
    1061 Dating (20 分)
    1042 Shuffling Machine (20 分)简单模拟
    1132 Cut Integer (20 分)
    1100 Mars Numbers (20 分)
    1077 Kuchiguse (20 分)求字符串最长相同后缀
    1065 A+B and C (64bit) (20 分)大数 溢出
    1107 Social Clusters (30 分)并查集
    1079 Total Sales of Supply Chain (25 分)
    1078 Hashing (25 分)
    1063 Set Similarity (25 分)
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6430408.html
Copyright © 2011-2022 走看看