- 浏览: 247563 次
- 性别:
- 来自: Shanghai
文章分类
最新评论
-
a790851624:
本人刚到公司,接到一个任务:在java代码中集成kettle的 ...
java应用程序中集成Kettle -
obnijeh:
谢谢共享,正需要。
Kettle 简介及Kettle用户操作手册 -
zhaokui:
很好,很好
Java中SimpleDateFormat用法详解——获得常用时间表示法(二) -
zhaokui:
,不错,不错
Java中SimpleDateFormat用法详解(一) -
babaoqi:
学习下,O(∩_∩)O谢谢了
Kettle 简介及Kettle用户操作手册
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 定时器框架的更多信息,请参阅 参考资料)。
计划单次任务
计划框架建立在 Java 定时器框架类的基础之上。因此,在解释如何使用计划框架以及如何实现它之前,我们将首先看看如何用这些类进行计划。
想像一个煮蛋计时器,在数分钟之后(这时蛋煮好了)它会发出声音提醒您。清单 1 中的代码构成了一个简单的煮蛋计时器的基本结构,它用 Java 语言编写:
清单 1. EggTimer 类
2
3import java.util.Timer;
4import java.util.TimerTask;
5
6public class EggTimer {
7 private final Timer timer = new Timer();
8 private final int minutes;
9
10 public EggTimer(int minutes) {
11 this.minutes = minutes;
12 }
13
14 public void start() {
15 timer.schedule(new TimerTask() {
16 public void run() {
17 playSound();
18 timer.cancel();
19 }
20 private void playSound() {
21 System.out.println("Your egg is ready!");
22 // Start a new thread to play a sound
23 }
24 }, minutes * 60 * 1000);
25 }
26
27 public static void main(String[] args) {
28 EggTimer eggTimer = new EggTimer(2);
29 eggTimer.start();
30 }
31
32}
33
EggTimer 实例拥有一个 Timer 实例,用于提供必要的计划。用 start() 方法启动煮蛋计时器后,它就计划了一个 TimerTask ,在指定的分钟数之后执行。时间到了, Timer 就在后台调用 TimerTask 的 start() 方法,这会使它发出声音。在取消计时器后这个应用程序就会中止。
计划重复执行的任务
通过指定一个固定的执行频率或者固定的执行时间间隔, Timer 可以对重复执行的任务进行计划。不过,有许多应用程序要求更复杂的计划。例如,每天清晨在同一时间发出叫醒铃声的闹钟不能简单地使用固定的计划频率 86400000 毫秒(24 小时),因为在钟拨快或者拨慢(如果您的时区使用夏令时)的那些天里,叫醒可能过晚或者过早。解决方案是使用日历算法计算每日事件下一次计划发生的时间。而这正是计划框架所支持的。考虑清单 2 中的 AlarmClock 实现(有关计划框架的源代码以及包含这个框架和例子的 JAR 文件,请参阅 参考资料):
清单 2. AlarmClock 类
2
3import java.text.SimpleDateFormat;
4
5import java.util.Date;
6
7import org.tiling.scheduling.Scheduler;
8import org.tiling.scheduling.SchedulerTask;
9import org.tiling.scheduling.examples.iterators.DailyIterator;
10
11public class AlarmClock {
12
13 private final Scheduler scheduler = new Scheduler();
14 private final SimpleDateFormat dateFormat =
15 new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");
16 private final int hourOfDay, minute, second;
17
18 public AlarmClock(int hourOfDay, int minute, int second) {
19 this.hourOfDay = hourOfDay;
20 this.minute = minute;
21 this.second = second;
22 }
23
24 public void start() {
25 scheduler.schedule(new SchedulerTask() {
26 public void run() {
27 soundAlarm();
28 }
29 private void soundAlarm() {
30 System.out.println("Wake up! " +
31 "It's " + dateFormat.format(new Date()));
32 // Start a new thread to sound an alarm
33 }
34 }, new DailyIterator(hourOfDay, minute, second));
35 }
36
37 public static void main(String[] args) {
38 AlarmClock alarmClock = new AlarmClock(7, 0, 0);
39 alarmClock.start();
40 }
41}
42
43
注意这段代码与煮蛋计时器应用程序非常相似。 AlarmClock 实例拥有一个 Scheduler (而不是 Timer )实例,用于提供必要的计划。启动后,这个闹钟对 SchedulerTask (而不是 TimerTask )进行调度用以发出报警声。这个闹钟不是计划一个任务在固定的延迟时间后执行,而是用 DailyIterator 类描述其计划。在这里,它只是计划任务在每天上午 7:00 执行。下面是一个正常运行情况下的输出:
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
...
DailyIterator 实现了 ScheduleIterator ,这是一个将 SchedulerTask 的计划执行时间指定为一系列 java.util.Date 对象的接口。然后 next() 方法按时间先后顺序迭代 Date 对象。返回值 null 会使任务取消(即它再也不会运行)―― 这样的话,试图再次计划将会抛出一个异常。清单 3 包含 ScheduleIterator 接口:
清单 3. ScheduleIterator 接口
2
3import java.util.Date;
4
5public interface ScheduleIterator {
6 public Date next();
7}
DailyIterator 的 next() 方法返回表示每天同一时间(上午 7:00)的 Date 对象,如清单 4 所示。所以,如果对新构建的 next() 类调用 next() ,那么将会得到传递给构造函数的那个日期当天或者后面一天的 7:00 AM。再次调用 next() 会返回后一天的 7:00 AM,如此重复。为了实现这种行为, DailyIterator 使用了 java.util.Calendar 实例。构造函数会在日历中加上一天,对日历的这种设置使得第一次调用 next() 会返回正确的 Date 。注意代码没有明确地提到夏令时修正,因为 Calendar 实现(在本例中是 GregorianCalendar )负责对此进行处理,所以不需要这样做。
清单 4. DailyIterator 类
2
3import org.tiling.scheduling.ScheduleIterator;
4
5import java.util.Calendar;
6import java.util.Date;
7http://robin88129.iteye.com/admin/blogs/%E5%9C%A8%20Java%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%AE%9A%E6%97%B6%E6%89%A7%E8
发表评论
-
Java虚拟机工作原理详解
2014-05-19 17:11 636一、类加载器 首先来看一下java程序的执行过程。 ... -
xml特殊字符转义技术
2013-12-05 15:14 1034在项目测试阶段,测试人员会输入一些特殊字符,比如:< ... -
junit4注解
2013-10-25 16:10 7591 @BeforeClass @AfterC ... -
java内部类的作用分析
2012-12-14 16:33 792提起Java内部类(Inner Class)可能很多人不 ... -
Weblogic远程调试
2012-10-15 15:04 714配置weblogic远程调试之前,需要做这几个工作: 1 ... -
log4j.properties配置详解
2012-06-08 11:18 753Log4J的配置文件(Configuration Fil ... -
Tomcat部署Web应用方法总结
2012-05-23 11:20 1243Tomcat部署Web应用方法 ... -
tomcat 的一些基本配置
2011-11-01 14:51 518管理员配置:打开tomcat安装目录里面的conf/tomca ... -
Ubuntu通过apt-get命令安装java jdk6
2011-09-01 08:15 1696其实Ubu ... -
Maven,ant 工具
2011-08-24 17:31 1307一:Maven,ant 工具比较 Apache ... -
java将多个文件一起打成zip包后下载实例
2011-08-24 17:23 3541//文件打包下载 pu ... -
jsp动态上传多个文件---实用的例子
2011-08-17 17:26 1216现在还有一个错误就是文件名是中文的话,就乱码。还在改进. u ... -
利用JAVA API发送E-mail
2011-08-03 16:57 897JAVA API 文档见附件 / ... -
JavaMail 发送邮件例子(包括附件,及信息,及html内容的图片处理)
2011-07-07 18:36 1393public void SendMessage(Str ... -
JavaMail API 核心解说
2011-07-07 18:30 1165(javaMail APL 例子资源见 ... -
Java api 全集
2011-06-02 18:14 804J2SE DK & API下载 ... -
Web Service优缺点
2011-03-25 11:27 4292一优点(版本一) 1、可操作的的分布式应用程序可以实现 ... -
java.util.Date与java.sql.Date相互转换
2011-03-24 10:22 1043在ResultSet中我们经常使用的setDate或getDa ... -
java DOM解析器 解析xml文件方法步骤,实例解析
2011-03-21 17:44 2413import java.io.*; import javax ... -
JAVA的XML编程实例解析
2011-03-20 15:19 674XML作为全球通用的结构化语言,越来越受人们青睐,各种开发平 ...
相关推荐
Java 定时任务,每天定时执行任务 Java 定时任务是指在 Java 语言中实现的定时执行任务的机制,通过使用 Timer 和 TimerTask 两个类,可以实现定时执行任务的功能。在这个例子中,我们将实现每天定时执行任务的功能...
Java定时任务调度是Java开发中常见的一种功能,用于在特定时间执行特定的任务,例如数据同步、日志清理、报表生成等。在Java中,有多种实现定时任务调度的方式,包括但不限于Java内置的`java.util.Timer`类、Spring...
在Web应用中,我们可以利用Servlet容器提供的特性来更优雅地处理定时任务,这就是描述中提到的方法。 首先,我们需要在`web.xml`文件中添加一个监听器(listener)。监听器是Servlet规范的一部分,它会在特定的事件...
Java定时任务是编程中常见的一种需求,用于在特定时间或间隔执行特定的代码逻辑。在这个“java定时任务小例子”中,我们可以看到两个关键文件:`TimerTest.java`和`DoTask.java`,它们分别代表了定时器的任务调度和...
Java定时任务是软件开发中一个不可或缺的特性,它允许程序在特定时间执行预定的任务,而无需用户干预。在Java世界里,实现定时任务的方式多种多样,包括但不限于使用Java内置的`java.util.Timer`和`java.util....
Java定时任务调度是Java开发中一个非常重要的技术领域,它允许开发者在特定的时间点或按照预定义的周期执行任务,从而实现自动化的工作流程。在Java中,我们可以使用多种方式来实现定时任务,如Java内置的`java.util...
《Java定时任务处理:基于Quartz的批处理定时任务调度平台》 在IT行业中,定时任务处理是一项重要的功能,尤其在大数据处理、系统维护、自动更新等场景中扮演着不可或缺的角色。Java作为广泛使用的编程语言,提供了...
`Timer`适合简单的定时任务,而`ScheduledExecutorService`更适合复杂的需求,如多线程环境和高并发场景。选择哪种方式取决于具体的应用场景和性能需求。在实际开发中,理解并熟练掌握这两种方法能帮助我们编写出...
在Java开发中,定时任务是不可或缺的一部分,尤其在企业级应用中,用于执行定期的数据处理、报表生成、系统维护等工作。Spring框架与Quartz库的整合提供了强大的动态管理定时任务的能力。下面我们将深入探讨这个主题...
Java定时任务是Java编程中一个重要的特性,它允许开发者安排任务在特定的时间点或周期性地执行。在Java中,我们可以使用内置的`java.util.Timer`类和`java.util.concurrent.ScheduledExecutorService`来实现定时任务...
Java定时任务管理框架是开发中常见的一种工具,用于在特定时间执行特定任务,极大地提高了工作效率。Citic Scheduler作为这样一个框架,旨在简化Java项目中的定时任务管理。它提供了一个直观的用户界面,允许开发者...
"java定时任务" java定时任务是指在java程序中,使用Timer和TimerTask来实现的定时执行任务的机制。java提供了多种方式来实现定时任务,包括使用java.util.Timer和java.util.TimerTask类、使用java.lang.Thread类的...
Java定时执行任务是Java开发中常见的一种需求,用于在特定时间点或按照预设周期执行某段代码。在Java中,有两种主要的方式来实现定时任务:Java.util.Timer类和java.util.concurrent包下的ScheduledExecutorService...
Java中的定时任务与定时器是实现自动化操作的关键技术之一,特别是在需要周期性执行某些功能的场景下,如数据同步、日志清理、定时发送邮件等。本文将深入探讨如何使用Java标准库中的`java.util.Timer`和`java.util....
Java定时任务是软件开发中的一个重要组成部分,特别是在服务端应用程序中,常常需要在特定时间执行某些操作,例如数据备份、清理过期数据、发送通知等。SpringBoot框架为开发者提供了便捷的方式来实现这些定时任务,...
总之,实现Java定时备份MySQL数据库需要理解如何在Java中调用外部命令,如何创建定时任务,以及如何与Spring等框架集成。在SSM项目中,可以利用Spring的定时任务特性来优雅地管理备份任务。记得在实际应用中处理异常...
Java定时任务调度是Java应用程序中常见的一种功能,用于在特定时间执行特定任务,例如定期备份、数据清理等。`Timer`类是Java中用于实现定时任务调度的一个基础工具,它位于`java.util`包中。在本文中,我们将深入...