一切类型的 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() 方法,这会使它发出声响。在取消计时器后这个应用顺序就会中止。