知识大全 Java语言中Timer类的简洁用法(一)
Posted 计划
篇首语:千磨万击还坚劲,任尔东西南北风。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java语言中Timer类的简洁用法(一)相关的知识,希望对你有一定的参考价值。
Java语言中Timer类的简洁用法(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
所有类型的 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(); cha138/Article/program/Java/JSP/201311/19734相关参考
JAVATIMER简单用法学习 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Timer有两种执
TimerTask与Timer类的应用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Timer
在实际应用中很多情况需要定时运行程序比如分钟或者小时执行一次程序对此操作java和C#一样可以使用Timer计时器实现即javautilTimer中的Timer类 Timer的定义Timerti
Java定时任务Timer 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java定时任务用到的
Java计时器Timer使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 所有类型的Java应
JAVA反射机制是在运行状态中对于任意一个类都能够得到这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
通过用static来定义方法或成员为我们编程提供了某种便利从某种程度上可以说它类似于C语言中的全局函数和全局变量 但是并不是说有了这种便利你便可以随处使用如果那样的话你便需要认真考虑一下自己是否
合理而实用的主卧室装饰,最重要的一点是依据房间的原结构形状和业主的意愿,做出针对性的设计方案。例如有这样一套主卧室,业主要求只做简洁好用的装饰。设计师做设计时的主导思想是方便使用和有利于安全隐秘。设计
用简洁语言的概括人生观,价值观,世界观,谢谢了!凡事都不计较,毕竟什么都不能带走;不管怎样都要让自己快乐;尽最大努力帮助身边的人用简洁的语言概括人生观,价值观,世界观,麻烦了,我想把这3个观了解.一定
在JAVA中定义类的结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 类的基本概念 Ja