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(); }
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(7, 0, 0); alarmClock.start(); } }
Wake up! It′s 24 Aug 2003 07:00:00.023 Wake up! It′s 25 Aug 2003 07:00:00.001 Wake up! It′s 26 Aug 2003 07:00:00.058 Wake up! It′s 27 Aug 2003 07:00:00.015 Wake up! It′s 28 Aug 2003 07:00:00.002 ...
/** * 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, 0); if (!calendar.getTime().before(date)) { calendar.add(Calendar.DATE, -1); } }
public Date next() { calendar.add(Calendar.DATE, 1); return calendar.getTime(); }
实时保证 在编写使用计划的应用程序时,一定要了解框架在时间方面有什么保证。我的任务是提前还是延迟执行?假如有提前或者延迟,偏差最大值是多少?不幸的是,对这些问题没有简单的答案。不过在实际中,它的行为对于很多应用程序已经足够了。下面的讨论假设系统时钟是正确的(有关网络时间协议(Network Time Protocol)的信息,请参阅 参考资料)。
Brian Goetz 的另一篇文章“Threading lightly, Part 2: RedUCing contention”(developerWorks,2001 年 9 月)分析了线程竞用以及如何减少它。
这里是 Java SDK 1.4 中 Timer 和 TimerTask 的文档。
Jcrontab 是用 Java 语言编写的另一个调度程序,它的目标是取代 cron。
Network Time Protocol (NTP) 是一个同步计算机时钟的协议。
Real-time Specification for Java 是 Java 平台的一个扩展,它提供了实时保证。这个站点包括一个参考实现。
Joshua Bloch 的 Effective Java Programming Language Guiden(Addison-Wesley,2001 年)给出了很好的建议(例如,Item 51: Don′t depend on the thread scheduler)。
要了解有关世界各地日历和使用它们的算法,请参阅 Nachum Dershowitz 和 Edward M. Reingold 的“Calendrical Calculations”(Cambridge University Press,1997 年)。
James Gosling、Bill Joy、Guy L. Steele Jr. 和 Gilad Bracha 编著的“The Java Language Specification, Second Edition ”(Addison-Wesley,2000 年)一书,第 17 章“Threads and Locks”描述了线程调度程序的行为。
Doug Lea 编著的“Concurrent Programming in Java: Design Principles and Patterns”(Addison-Wesley,1999 年)是一本好书,它深入探讨了 Java 平台中并发的各个方面。