目前的 Web 应用,多数应用都具备任务调度的功能。这里就简单的介绍任务调度的Java 实现方法,主要包括 Timer,Scheduler, Quartz 以及 JCron Tab,目的在于给需要开发任务调度的牛牛们提供一个参考。

1.Timer

大部分已经非常熟悉 java.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子:

使用 Timer 实现任务调度的核心类是 Timer 和 TimerTask。其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。

Timer 的设计核心是一个TaskList 和一个TaskThread。Timer 将接收到的任务丢到自己的 TaskList中,TaskList 按照 Task 的最初执行时间进行排序。TimerThread 在创建 Timer 时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread 被唤醒并执行该任务。之后 TimerThread 更新最近一个要执行的任务,继续休眠。

Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。

2.ScheduledExecutor

鉴于 Timer 的上述缺陷,Java 5 推出了基于线程池设计的 ScheduledExecutor。其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。需要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。如下图:

ScheduledExecutorService 中两种最常用的调度方法 ScheduleAtFixedRate和 ScheduleWithFixedDelay。ScheduleAtFixedRate 每次执行时间为上一次任务开始起向后推一个时间间隔,即每次执行时间为 :initialDelay, initialDelay+period, initialDelay+2*period, …;ScheduleWithFixedDelay 每次执行时间为上一次任务结束起向后推一个时间间隔,即每次执行时间为:initialDelay, initialDelay+executeTime+delay, initialDelay+2*executeTime+2*delay。由此可见,ScheduleAtFixedRate 是基于固定时间间隔进行任务调度,ScheduleWithFixedDelay 取决于每次任务执行的时间长短,是基于不固定时间间隔进行任务调度。

3.ScheduledExecutor 和 Calendar 实现复杂任务调度

Timer 和 ScheduledExecutor 都仅能提供基于开始时间与重复间隔的任务调度,不能胜任更加复杂的调度需求。比如,设置每星期四的 17:20:00 执行任务。该功能使用 Timer 和 ScheduledExecutor 都不能直接实现,但我们可以借助 Calendar 间接实现该功能。

以上例子实现了每星期四 17:20:00 执行调度任务的功能。原理是根据当前时间推算出最近一个星期四17:20:00的绝对时间,然后计算与当前时间的时间差,再去调用 ScheduledExceutor 函数的参数。

计算最近时间用到 java.util.calendar 的功能。先解释一下calendar的一些设计思想。Calendar有以下几种唯一标识一个日期的组合方式:YEAR + MONTH + DAY_OF_MONTH

YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK

YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK

YEAR + DAY_OF_YEAR

YEAR + DAY_OF_WEEK + WEEK_OF_YEAR

上述组合分别加上 HOUR_OF_DAY + MINUTE + SECOND 即为一个完整的时间标识。上面的例子是采用最后一种组合方式。

可以看出,用以上的这个方法实现该任务调度还是比较麻烦的,这就需要一个更加完善的任务调度框架来解决这些复杂的调度问题。幸运的是,开源工具包 Quartz 与 JCronTab 提供了这方面强大的支持。

4.Quartz

Quartz jar下载地址:http://pan.baidu.com/s/1o6pvDTS

Quartz 可以满足更多更复杂的调度需求,首先让我们看以下实例:

以上非常简洁地实现了任务调度。Quartz 设计的核心类包括 Scheduler, Job 以及 Trigger。其中,Job 负责定义需要执行的任务,Trigger 负责设置调度策略,Scheduler 将二者组装在一起,并触发任务开始执行。

好了,先就介绍以上几种吧 Quartz的其他配置以及和JCronTab另外找个时间分享吧。希望给有需要的牛牛们提供一些帮助!

由最代码官方编辑于2014-3-20 18:32:16

java timer demo_java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享...相关推荐

  1. java中thread实例_Java多线程并发执行demo代码实例

    主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...

  2. Java Web项目中缺少Java EE 6 Libraries怎么添加

    Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...

  3. Java实现MD5加密及解密的代码实例分享

    如果对安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享: 基础:M ...

  4. php md5加密 java代码_Java实现MD5加密及解密的代码实例分享

    基础:MessageDigest类的使用 其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/** * 对字符串md5加密 * * @param str ...

  5. java 代码压缩javascript_通过Java压缩JavaScript代码实例分享

    通过移除空行和注释来压缩 javascript 代码 /** * this file is part of the echo web application framework (hereinafte ...

  6. java 删除压缩zip文件_从ZIP存档中删除文件,而无需在Java或Python中解压缩 - java...

    从ZIP存档中删除文件,而无需使用Java(首选)或Python解压缩 你好 我使用包含数百个高度压缩的文本文件的大型ZIP文件.解压缩ZIP文件时,可能要花一些时间,并且很容易消耗多达20 GB的磁 ...

  7. acm c 和java如何取舍,ACM中使用JAVA语言的优缺点介绍

    Chapter I. Java的优缺点各种书上都有,这里只说说用Java做ACM-ICPC的特点: (1) 最明显的好处是,学会Java,可以参加Java Challenge   :) (2) 对于熟 ...

  8. java php同时访问数据库,Java Spring中同时访问多种不同数据库的代码实例分享

    开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中.使用Spring框架时,使用单一数据库是非常容易的,但如果要同时 ...

  9. java io printwriter_Java中的Java.io.PrintWriter类| 1 - Break易站

    Java I/O总结 Java中的Java.io.PrintWriter类| 1 该类将对象的格式化表示形式打印到文本输出流.它实现了PrintStream中的所有打印方法.它不包含写入原始字节的方法 ...

最新文章

  1. LeetCode刷题-6
  2. [网络安全自学篇] 三十六.WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动劫持机理
  3. java 简单数据类型_java基本数据类型
  4. .NET二级域名共享Session
  5. 面试题25:合并两个排序的链表
  6. [BZOJ]3926 诸神眷顾的幻想乡(ZJOI2015)
  7. iOS软件开发架构理解
  8. 多商户商城源码_多商户商城APP开发解决方案
  9. JVM学习总结四——内存分配策略
  10. 厦门大学904数据结构与机器学习资料与辅导
  11. excel随机数_利用excel快速凭空制造大量随机数据?想要制造什么数据都可以
  12. “大数据分析”和“数据分析”的区别与联系
  13. 安森美推出新的高功率图腾柱PFC控制器,满足具挑战的能效标准
  14. python处理视频图像_图像/视频处理选项
  15. 【微信小程序】微信小程序函数封装
  16. 调试设置移动端Web开发环境搭建实践
  17. 《异地恋神器》《奇巧淫计》Python实现邮箱每天自动定时罗莉音播报天气预报
  18. 啊哈c语言有函数么,啊哈c-啊哈c为什么不能运行??如图
  19. 塔望食业洞察丨方便速食行业市场现状、消费趋势、品牌策略分析
  20. 回文数-第14届蓝桥杯Scratch选拔赛真题

热门文章

  1. Android 核心组件 Activity 之上
  2. javascript onbeforeunload与onunload事件
  3. 子页面应用母版页图片无法显示
  4. 趣味思考--苹果剩余最大量
  5. 我的2008,专注而行
  6. Android高级模糊技术
  7. java 构建 数字 list_数字全排列返回list的list:java实现
  8. Android 系统开发系列三
  9. 学习OpenGL-ES: 2 - EGL解析
  10. wpf之auto与*的区别