Java Timer TimerTask示例

时间:2020-02-23 14:36:58  来源:igfitidea点击:

Java java.util.Timer是一个实用程序类,可用于安排将来某个特定时间执行的线程。
Java Timer类可用于安排任务一次运行或者定期运行。

Java TimerTask

java.util.TimerTask是实现Runnable接口的抽象类,我们需要扩展此类以创建可以使用java Timer类进行调度的自己的TimerTask。

Java计时器示例

Java Timer类是线程安全的,并且多个线程可以共享一个Timer对象,而无需外部同步。
Timer类使用java.util.TaskQueue在给定的固定间隔内添加任务,并且在任何时候都只能有一个线程运行TimerTask,例如,如果要创建一个每10秒运行一次的Timer,但单线程执行需要20秒,然后,Timer对象将继续向队列中添加任务,并且一旦一个线程完成,它将通知队列,而另一个线程将开始执行。

Java Timer类使用对象等待和通知方法来计划任务。

这是Java Timer和TimerTask示例的简单程序。

package com.theitroad.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秒,但是Java Timer对象被安排为每10秒运行一次任务。
这是程序的输出:

TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012

输出确认如果一个任务已经在执行,Timer将等待它完成,一旦完成,它将再次从队列中开始下一个任务。

可以创建Java Timer对象,以将其作为守护程序线程运行。
Timer cancel()方法用于终止计时器并丢弃所有计划的任务,但是它不会干扰当前正在执行的任务并使其完成。
如果计时器作为守护程序线程运行,则无论我们是否取消它,它都会在所有用户线程完成执行后立即终止。

计时器类包含几个schedule()方法,以安排任务在给定日期或者延迟一段时间后运行一次。
有几种scheduleAtFixedRate()方法可按一定间隔定期运行任务。

使用Timer计划任务时,应确保时间间隔大于正常线程执行的时间,否则任务队列大小将不断增长,最终任务将始终执行。