Java中的定时器Timer

Posted 逝者如斯,不舍昼夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的定时器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 com.journaldev.threads;
 
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
public class MyTimerTask extends TimerTask {
 
    @Override
    public void run() {
        System.out.println("Timer task started at:"+new Date());
        completeTask();
        System.out.println("Timer task finished at:"+new Date());
    }
 
    private void completeTask() {
        try {
            //assuming it takes 20 secs to complete the task
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //running timer task as daemon thread
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancel after sometime
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("TimerTask cancelled");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

  注意,一个线程执行花费20秒,但Timer对象每10秒就调度一次任务。如下是程序的输出。

TimerTask started
Timer task started at:Mon Mar 03 12:58:24 CST 2014
Timer task finished at:Mon Mar 03 12:58:44 CST 2014
Timer task started at:Mon Mar 03 12:58:44 CST 2014
Timer task finished at:Mon Mar 03 12:59:04 CST 2014
Timer task started at:Mon Mar 03 12:59:04 CST 2014
Timer task finished at:Mon Mar 03 12:59:24 CST 2014
Timer task started at:Mon Mar 03 12:59:24 CST 2014
Timer task finished at:Mon Mar 03 12:59:44 CST 2014
Timer task started at:Mon Mar 03 12:59:44 CST 2014
Timer task finished at:Mon Mar 03 13:00:04 CST 2014
Timer task started at:Mon Mar 03 13:00:04 CST 2014
TimerTask cancelled
Timer task finished at:Mon Mar 03 13:00:24 CST 2014

 

  输出结果证实,如果一个任务已经执行,Timer将等待它执行结束,一旦任务执行结束,Timer对象将再次启动队列中的下一个任务。

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

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

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

 

 

   

 

 

  原文链接: journaldev 翻译: ImportNew.com - liken
  译文链接: http://www.importnew.com/9978.html
  [ 转载请保留原文出处、译者和译文链接。]

 

以上是关于Java中的定时器Timer的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Timer定时器

定时任务Timer

Java定时任务:利用java Timer类实现定时执行任务的功能

Java定时任务工具详解之Timer篇

Java Timer 定时器的使用

在Java中如何实现较为精确的定时器