• JAVA中的Timer类的使用详解
  • 老妖 发表于 2016/3/5 11:40:00 | 分类标签: 多线程 线程安全 Timer类
  • java.util.Timer是一个实用工具类,该类用来调度一个线程,使线程可以在将来某一时刻开始执行。 Java的Timer类可以调度一个线程运行一次,或定期运行。

    java.util.TimerTask是一个抽象类,它实现了Runnable接口。我们需要扩展该类以便创建自己的TimerTask,这个TimerTask内部使用java Timer类,可以被调度。

    Timer类是线程安全的,多线程不需要外部同步机制就可以共享同一个Timer对象。Timer类使用java.util.TaskQueue在指定时间间隔添加任务,在任何时刻只能有一个线程执行TimerTask。例如,创建一个每10秒运行的Timer,但单个线程的执行时间花费20秒,Timer对象将持续将线程添加到队列,一旦有线程结束,它就会通知队列,并且另外一个线程将启动执行。

    Timer类使用对象的wait和notify方法来调度线程。

    如下是一个使用Timer和TimerTask的实例:
    package Thread;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    public class TimerTest {
    public static void main(String[] args){
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run()
    {
    System.out.println("Timer task started at:"+new Date());
    try
    {
    Thread.sleep(20*1000);
    }
    catch (InterruptedException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("Timer task finished at:"+new Date());
    }

    }, 0, 10*1000);
    System.out.println("TimerTask started");
    try
    {
    Thread.sleep(120*1000);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    timer.cancel();
    System.out.println("TimerTask cancelled");
    try
    {
    Thread.sleep(30*1000);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    }
    注意,一个线程执行花费20秒,但Timer对象每10秒就调度一次任务。如下是程序的输出。
    TimerTask started
    Timer task started at:Fri Mar 04 16:04:13 CST 2016
    Timer task finished at:Fri Mar 04 16:04:33 CST 2016
    Timer task started at:Fri Mar 04 16:04:33 CST 2016
    Timer task finished at:Fri Mar 04 16:04:53 CST 2016
    Timer task started at:Fri Mar 04 16:04:53 CST 2016
    Timer task finished at:Fri Mar 04 16:05:13 CST 2016
    Timer task started at:Fri Mar 04 16:05:13 CST 2016
    Timer task finished at:Fri Mar 04 16:05:33 CST 2016
    Timer task started at:Fri Mar 04 16:05:33 CST 2016
    Timer task finished at:Fri Mar 04 16:05:53 CST 2016
    Timer task started at:Fri Mar 04 16:05:53 CST 2016
    TimerTask cancelled
    Timer task finished at:Fri Mar 04 16:06:13 CST 2016
    输出结果证实,如果一个线程(指继承于TimerTask的线程)正在执行,Timer将等待它执行结束,一旦该线程执行结束,Timer对象将立即启动队列中的下一个线程。

    Timer对象可作为一个守护线程运行相关的任务。Timer的cancel()方法用于终止计时器,并丢弃待调度的线程。然而,Timer不会干扰当前执行的线程,并且让它执行结束(最后一条在TimerTask cancelled之后输出)。如果计时器用于执行守护线程,无论是否取消它,它都会等待所有用户线程结束后终止。

    Timer类包含一些sechedule()方法用于调度一个线程在指定时间运行一次或者延时之后运行,还有一些scheduleAtFixedRate()方法用于在一定间隔后周期运行线程。

    当使用Timer调度线程时,必须确保调度的时间间隔超过线程的正常运行时间,否则任务队列的大小将持续增长,最终程序将无法停止。
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:老妖
  • 加入时间:2013/6/13 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮