本帖最后由 西安Java组 于 2018-2-1 13:01 编辑
第一种实现方式 : TimerTimer类是由JDK提供的,可以用来执行简单的定时任务; 1).延迟执行任务, 任务只执行一次[Java] 纯文本查看 复制代码 public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date() + " : It is time to send mail to leader ... ");
}
}, 2000);
}
2).延迟一定时间执行任务, 任务周期性执行[Java] 纯文本查看 复制代码 public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date() + " : It is time to send mail to leader ... ");
}
}, 2000, 1000);
}
3).任务到达时间后执行 , 仅执行一次
[Java] 纯文本查看 复制代码 public static void main(String[] args) {
System.out.println(new Date() +" : 程序开始执行 ...");
Timer timer = new Timer();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND, 30);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date() + " : It is time to send mail to leader ... ");
}
}, calendar.getTime());
}
4).任务到达时间后执行 , 之后每隔一段时间执行
[Java] 纯文本查看 复制代码 public static void main(String[] args) {
System.out.println(new Date() +" : 程序开始执行 ...");
Timer timer = new Timer();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND, 10);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(new Date() + " : It is time to send mail to leader ... ");
}
}, calendar.getTime(),3000);
}
上述JDK提供的定时器只能够执行一些简单的定时任务 , 一些稍微复杂些的定时实现起来比较麻烦 ; 比如 , 需要实现上午09:00下午 18:00 执行定时任务发送邮件 ;
第二种实现方式 : Spring对定时任务的支持scheduled-tasks
1).引入依赖 只需要引入核心依赖就可以了 [Java] 纯文本查看 复制代码 <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependencies>
2).定义任务类 就是一个简单的java类 , 其中定义任务方法sendMail() [Java] 纯文本查看 复制代码 public class MyTask1 {
public void sendMail(){
System.out.println(new Date() + " : It is time to send mail to leader ...");
}
}
3).配置任务bean 将定义好的任务类, 交给spring容器管理 [XML] 纯文本查看 复制代码 <bean id="task1" class="timerdemo.MyTask1"></bean>
4). 配置任务 A. 延迟一段时间执行第一次任务,之后每隔固定时间(是从上一次任务执行完成时间开始计算)执行[XML] 纯文本查看 复制代码 <task:scheduled-tasks>
<task:scheduled ref="task1" method="sendMail" initial-delay="2000" fixed-delay="5000"/>
</task:scheduled-tasks>
ref : 指任务类的bean的id method : 任务类中的具体执行任务的方法名 initial-delay: 第一次执行任务的时候延迟时间 , 需要配置fixed-rate 或 fixed-delay使用 fixed-delay: 执行的时间周期 (是从上一次任务执行完成时间开始计算)
B. 延迟一段时间执行第一次任务, 之后每隔固定时间(是从上一次任务执行开始时间开始计算)执行 [XML] 纯文本查看 复制代码 <task:scheduled-tasks>
<task:scheduled ref="task1" method="sendMail" initial-delay="2000" fixed-rate="5000"/>
</task:scheduled-tasks>
ref : 指任务类的bean的id method : 任务类中的具体执行任务的方法名 initial-delay: 第一次执行任务的时候延迟时间 , 需要配置fixed-rate 或 fixed-delay使用 fixed-rate: 执行的时间周期 (是从上一次任务执行开始时间开始计算)
C. 按照执行的cron表达式指定的时间执行任务 [XML] 纯文本查看 复制代码 <task:scheduled-tasks>
<task:scheduled ref="task1" method="sendMail" cron="0 0 9,18 * * *"/>
</task:scheduled-tasks>
上述表达式含义 : 每天上午09:00:00 和 下午的 18:00:00 执行任务
cron表达式介绍 :一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素 按顺序依次为 : 秒 ------------(0~59) 分钟 ----------(0~59) 小时 ----------(0~23) 天 ------------(0~31,但是你需要考虑你月的天数) 月 ------------(0~11) 周(星期) -----(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 年份 ---------(1970-2099) 其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。 Cron表达式的样例 : 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 0 0 12 * * ? 每天中午12点触发 0 15 10 ? * * 每天上午10:15触发 0 15 10 * * ? 每天上午10:15触发 0 15 10 * * ? * 每天上午10:15触发 0 15 10 * * ? 2005 2005年的每天上午10:15触发 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 0 0/5 14,18 * * ? 每天14点到2:55期间和18点到6:55期间每5分触发 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 0 15 10 15 * ? 每月15日上午10:15触发 0 15 10 L * ? 每月最后一日的上午10:15触发 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 0 15 10 ? * 6L 2002-2005 2002年至2005年每月最后一个星期五10:15触发 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
|