Java语言中Timer类的简洁用法

  所有类型的Java应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个J2SE或者J2ME日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类Timer和TimerTask没有足够的灵活性,无法支持通常需要的计划任务类型。在本文中,Java开发人员Tom White向您展示了如何构建一个简单通用的计划框架,以用于执行任意复杂的计划任务。
  把java.util.Timer和java.util.TimerTask统称为Java计时器框架,它们使程序员可以很容易地计划简单的任务(注意这些类也可用于J2ME中)。在Java 2 SDK,Standard Edition,Version 1.3中引入这个框架之前,开发人员必须编写自己的调度程序,这需要花费很大精力来处理线程和复杂的Object.wait()方法。不过,Java计时器框架没有足够的能力来满足许多应用程序的计划要求。甚至一项需要在每天同一时间重复执行的任务,也不能直接使用Timer来计划,因为在夏令时开始和结束时会出现时间跳跃。
  本文展示了一个通用的Timer和TimerTask计划框架,从而允许更灵活的计划任务。这个框架非常简单??它包括两个类和一个接口??并且容易掌握。如果您习惯于使用Java定时器框架,那么您应该可以很快地掌握这个计划框架。
  计划单次任务
  计划框架建立在Java定时器框架类的基础之上。因此,在解释如何使用计划框架以及如何实现它之前,我们将首先看看如何用这些类进行计划。
  想像一个煮蛋计时器,在数分钟之后(这时蛋煮好了)它会发出声音提醒您。清单1中的代码构成了一个简单的煮蛋计时器的基本结构,它用Java语言编写:
  清单1.EggTimer类
  package org.tiling.scheduling.examples;
  import java.util.Timer;
  import java.util.TimerTask;
  public class EggTimer{
  private final Timer timer=new Timer();
  private final int minutes;
  public EggTimer(int minutes){
  this.minutes=minutes;
  }
  public void start(){
  timer.schedule(new TimerTask(){
  public void run(){
  playSound();
  timer.cancel();
  }
  private void playSound(){
  System.out.println("Your egg is ready!");
  //Start a new thread to play a sound...
  }
  },minutes*60*1000);
  }
  public static void main(String[]args){
  EggTimer eggTimer=new EggTimer(2);
  eggTimer.start();
  }
  }
  EggTimer实例拥有一个Timer实例,用于提供必要的计划。用start()方法启动煮蛋计时器后,它就计划了一个TimerTask,在指定的分钟数之后执行。时间到了,Timer就在后台调用TimerTask的start()方法,这会使它发出声音。在取消计时器后这个应用程序就会中止。