您现在的位置是:首页
>
简洁的语言是什么意思 Java语言中Timer类的简洁用法(一)
Java语言中Timer类的简洁用法 一 所有类型的 Java 应用程序一般都需要计划重复执行的任务 企业应用程序需要计划每日的日志或者晚间批处理过程 一个 J SE 或者 J ME 日历应用程序
Java语言中Timer类的简洁用法(一)

所有类型的 Java 应用程序一般都需要计划重复执行的任务 企业应用程序需要计划每日的日志或者晚间批处理过程 一个 J SE 或者 J ME 日历应用程序需要根据用户的约定计划闹铃时间 不过 标准的调度类 Timer 和 TimerTask 没有足够的灵活性 无法支持通常需要的计划任务类型 在本文中 Java 开发人员 Tom White 向您展示了如何构建一个简单通用的计划框架 以用于执行任意复杂的计划任务 我将把 java util Timer 和 java util TimerTask 统称为 Java 计时器框架 它们使程序员可以很容易地计划简单的任务(注意这些类也可用于 J ME 中) 在 Java SDK Standard Edition Version 中引入这个框架之前 开发人员必须编写自己的调度程序 这需要花费很大精力来处理线程和复杂的 Object wait() 方法 不过 Java 计时器框架没有足够的能力来满足许多应用程序的计划要求 甚至一项需要在每天同一时间重复执行的任务 也不能直接使用 Timer 来计划 因为在夏令时开始和结束时会出现时间跳跃 本文展示了一个通用的 Timer 和 TimerTask 计划框架 从而允许更灵活的计划任务 这个框架非常简单 —— 它包括两个类和一个接口 —— 并且容易掌握 如果您习惯于使用 Java 定时器框架 那么您应该可以很快地掌握这个计划框架 计划单次任务 计划框架建立在 Java 定时器框架类的基础之上 因此 在解释如何使用计划框架以及如何实现它之前 我们将首先看看如何用这些类进行计划 想像一个煮蛋计时器 在数分钟之后(这时蛋煮好了)它会发出声音提醒您 清单 中的代码构成了一个简单的煮蛋计时器的基本结构 它用 Java 语言编写 清单 EggTimer 类 package 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 * * ); } public static void main(String[] args) { EggTimer eggTimer = new EggTimer( ); eggTimer start(); } } EggTimer 实例拥有一个 Timer 实例 用于提供必要的计划 用 start() 方法启动煮蛋计时器后 它就计划了一个 TimerTask 在指定的分钟数之后执行 时间到了 Timer 就在后台调用 TimerTask 的 start() 方法 这会使它发出声音 在取消计时器后这个应用程序就会中止 计划重复执行的任务 通过指定一个固定的执行频率或者固定的执行时间间隔 Timer 可以对重复执行的任务进行计划 不过 有许多应用程序要求更复杂的计划 例如 每天清晨在同一时间发出叫醒铃声的闹钟不能简单地使用固定的计划频率 毫秒( 小时) 因为在钟拨快或者拨慢(如果您的时区使用夏令时)的那些天里 叫醒可能过晚或者过早 解决方案是使用日历算法计算每日事件下一次计划发生的时间 而这正是计划框架所支持的 考虑清单 中的 AlarmClock 实现 清单 AlarmClock 类 package tiling scheduling examples; import java text SimpleDateFormat; import java util Date; import tiling scheduling Scheduler; import tiling scheduling SchedulerTask; import tiling scherators DailyIterator; public class AlarmClock { private final Scheduler scheduler = new Scheduler(); private final SimpleDateFormat dateFormat = new SimpleDateFormat( dd MMM yyyy HH:mm:ss SSS ); private final int hourOfDay minute second; public AlarmClock(int hourOfDay int minute int second) { this hourOfDay = hourOfDay; this minute = minute; this second = second; } public void start() { scheduler schedule(new SchedulerTask() { public void run() { soundAlarm(); } private void soundAlarm() { System out println( Wake up! + It s + dateFormat format(new Date())); // Start a new thread to sound an alarm } } new DailyIterator(hourOfDay minute second)); } public static void main(String[] args) { AlarmClock alarmClock = new AlarmClock( ); alarmClock start(); } } 注意这段代码与煮蛋计时器应用程序非常相似 AlarmClock 实例拥有一个 Scheduler (而不是 Timer)实例 用于提供必要的计划 启动后 这个闹钟对 SchedulerTask (而不是 TimerTask)进行调度用以发出报警声 这个闹钟不是计划一个任务在固定的延迟时间后执行 而是用 DailyIterator 类描述其计划 在这里 它只是计划任务在每天上午 : 执行 下面是一个正常运行情况下的输出 Wake up! It s Aug : : Wake up! It s Aug : : Wake up! It s Aug : : Wake up! It s Aug : : Wake up! It s Aug : : DailyIterator 实现了 ScheduleIterator 这是一个将 SchedulerTask 的计划执行时间指定为一系列 java util Date 对象的接口 然后 next() 方法按时间先后顺序迭代 Date 对象 返回值 null 会使任务取消(即它再也不会运行)—— 这样的话 试图再次计划将会抛出一个异常 清单 包含 ScheduleIterator 接口 清单 ScheduleIterator 接口 package tiling scheduling; import java util Date; public interface ScheduleIterator { public Date next(); } DailyIterator 的 next() 方法返回表示每天同一时间(上午 : )的 Date 对象 如清单 所示 所以 如果对新构建的 next() 类调用 next() 那么将会得到传递给构造函数的那个日期当天或者后面一天的 : AM 再次调用 next() 会返回后一天的 : AM 如此重复 为了实现这种行为 DailyIterator 使用了 java util Calendar 实例 构造函数会在日历中加上一天 对日历的这种设置使得第一次调用 next() 会返回正确的 Date 注意代码没有明确地提到夏令时修正 因为 Calendar 实现(在本例中是 GregorianCalendar)负责对此进行处理 所以不需要这样做 清单 DailyIterator 类 package tiling scherators; import tiling scheduling ScheduleIterator; import java util Calendar; import java util Date; /** * A DailyIterator class returns a sequence of dates on subsequent days * representing the same time each day */ public class DailyIterator implements ScheduleIterator { private final int hourOfDay minute second; private final Calendar calendar = Calendar getInstance(); public DailyIterator(int hourOfDay int minute int second) { this(hourOfDay minute second new Date()); } public DailyIterator(int hourOfDay int minute int second Date date) { this hourOfDay = hourOfDay; this minute = minute; this second = second; calendar setTime(date); calendar set(Calendar HOUR_OF_DAY hourOfDay); calendar set(Calendar MINUTE minute); calendar set(Calendar SECOND second); calendar set(Calendar MILLISECOND ); if (!calendar getTime() before(date)) { calendar add(Calendar DATE ); } } public Date next() { calendar add(Calendar DATE ); return calendar getTime(); } } lishixinzhi/Article/program/Java/JSP/201311/19734
很赞哦! (1045)