java timer demo_java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享...
目前的 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代码实例分享...相关推荐
- java中thread实例_Java多线程并发执行demo代码实例
主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...
- Java Web项目中缺少Java EE 6 Libraries怎么添加
Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...
- Java实现MD5加密及解密的代码实例分享
如果对安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享: 基础:M ...
- php md5加密 java代码_Java实现MD5加密及解密的代码实例分享
基础:MessageDigest类的使用 其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/** * 对字符串md5加密 * * @param str ...
- java 代码压缩javascript_通过Java压缩JavaScript代码实例分享
通过移除空行和注释来压缩 javascript 代码 /** * this file is part of the echo web application framework (hereinafte ...
- java 删除压缩zip文件_从ZIP存档中删除文件,而无需在Java或Python中解压缩 - java...
从ZIP存档中删除文件,而无需使用Java(首选)或Python解压缩 你好 我使用包含数百个高度压缩的文本文件的大型ZIP文件.解压缩ZIP文件时,可能要花一些时间,并且很容易消耗多达20 GB的磁 ...
- acm c 和java如何取舍,ACM中使用JAVA语言的优缺点介绍
Chapter I. Java的优缺点各种书上都有,这里只说说用Java做ACM-ICPC的特点: (1) 最明显的好处是,学会Java,可以参加Java Challenge :) (2) 对于熟 ...
- java php同时访问数据库,Java Spring中同时访问多种不同数据库的代码实例分享
开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中.使用Spring框架时,使用单一数据库是非常容易的,但如果要同时 ...
- java io printwriter_Java中的Java.io.PrintWriter类| 1 - Break易站
Java I/O总结 Java中的Java.io.PrintWriter类| 1 该类将对象的格式化表示形式打印到文本输出流.它实现了PrintStream中的所有打印方法.它不包含写入原始字节的方法 ...
最新文章
- LeetCode刷题-6
- [网络安全自学篇] 三十六.WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动劫持机理
- java 简单数据类型_java基本数据类型
- .NET二级域名共享Session
- 面试题25:合并两个排序的链表
- [BZOJ]3926 诸神眷顾的幻想乡(ZJOI2015)
- iOS软件开发架构理解
- 多商户商城源码_多商户商城APP开发解决方案
- JVM学习总结四——内存分配策略
- 厦门大学904数据结构与机器学习资料与辅导
- excel随机数_利用excel快速凭空制造大量随机数据?想要制造什么数据都可以
- “大数据分析”和“数据分析”的区别与联系
- 安森美推出新的高功率图腾柱PFC控制器,满足具挑战的能效标准
- python处理视频图像_图像/视频处理选项
- 【微信小程序】微信小程序函数封装
- 调试设置移动端Web开发环境搭建实践
- 《异地恋神器》《奇巧淫计》Python实现邮箱每天自动定时罗莉音播报天气预报
- 啊哈c语言有函数么,啊哈c-啊哈c为什么不能运行??如图
- 塔望食业洞察丨方便速食行业市场现状、消费趋势、品牌策略分析
- 回文数-第14届蓝桥杯Scratch选拔赛真题