任务调度学习-----Quartz和Timer
目的
通过编写程序,让计算机在特定的时间点开启线程进行工作
实际应用举例
- 在王者荣耀或者英雄联盟中,玩家被惩罚一段时间不能登陆游戏,那么玩家被解除惩罚就通过任务调度完成,在到达的时间点更改玩家的状态,使之可以继续玩游戏。
- 对于一些数据业务,我们有时需要扫描数据库进行统计汇总,比如在在凌晨扫描数据库生成前一天的业务销售情况表以供其他部门分析,这里也需要用到定时任务的调度。
Timer讲解
java为我们提供了完成定时任务的工具包–java.util.TimerTask,对于时间结点短,精度要求不高的定义任务,Timer将是很方便的工具包,不仅代码编写很方便,而且在执行任务的时候对计算机的资源消耗也更少。
Timer的用法
我们通过继承TimerTask这个类来编写任务逻辑,具体是重写TimeTask里面的run方法,在调用这个任务类的时候,我们需要借助Timer类,将我们编写的TimerTask子类作为参数传入给Timer进行任务调用,示例代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
/**
* Created by 罗浩 on 2017/9/18.
*/
public class TimerJob extends TimerTask {
@Override
public void run() {
System.out.println("当前执行的任务是TimerJob" );
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current time :" + sf.format(date));
}
}
主函数测试代码:
public class TimerRun {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current time :" + sf.format(date));
System.out.println("开始执行定时任务========");
Timer timer = new Timer();
TimerJob myTimeJob = new TimerJob();
timer.schedule(myTimeJob,2000L,1000L);
}
}
成功截图:
-
对于纯粹java提供的Timer包,每一个任务的执行都会开启一个线程,而线程是JVM级别的,如果你的程序是作用在webapp上面,当tomcat停止应用程序时,若不手动关闭Timer,定时任务的线程将继续执行下去(不太建议在tomcat里面私自开启新的线程,主线程也一样)
- 虽然Timer代码编写很简单,但是Timer在定时上面有很大的局限,而Quartz能通过日历进行定时任务,这也是Quartz任务调度框架如此强大的一个重要原因。
##Quartz简介
Quartz是一个开源的任务调度框架,它提供了强大的任务调度机制,不仅在定时上面可以采用日历带来的简便,还支持调度过程中运行环境的持久化机制,可以保存和恢复调度现场。
Quartzd的核心概念
触发器里面定义了定时任务的出发规则,比如什么时候要开始第一次执行,执行的次数和频度
调度器里面涉及到线程池、日历、以及任务,统筹规划调用系统资源来完成定时任务
Quartz与Sping 的整合
对于Quartz里面的Job、Trigger、Schedule的使用方法不进行讲解,直接将如何在sping中整合Quartz,demo项目结构如下:
里面分别编写了三种定时任务,一种是java提供的TimerTask,一种是直接实现的Quartz的Job接口(JobDetailFactoryBean),一种是MethodInvokingJobDetailFactoryBean,然后触发器用了两种实现,分别是SimpleTrigger,一种是CronTrigger
运行成功截图:
项目Github地址:https://github.com/luohaotian/QuaartzDemo
Cron表达式
对于cron表达式,可以借鉴下面两幅图理解:
上一篇: 布谷鸟 散列java实现
下一篇: 整数散列