java定时器实现总结
前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架。

1. JDK组件
(1) java.util.TimerTask

MyTimerTask.java:
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("MyTimerTask, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), 1000, 1000);
//timer.cancel(); //停止调度器
}
}
(2) java.util.concurrent.ScheduledThreadPoolExecutor(JDK5.0+之后推荐使用)

MyScheduledTask.java:
public class MyScheduledTask implements Runnable {
public void run() {
System.out.println("my scheduled task, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
MyScheduledExecutor.java:
public class MyScheduledExecutor {
public static void main(String[] args) {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
ScheduledFuture future = executor.scheduleWithFixedDelay(new MyScheduledTask(), 1000, 1000, TimeUnit.MILLISECONDS);
//future.cancel(true); // 停止定时任务,Timer不能停止定时任务,只能关闭调度器
//executor.shutdown(); // 关闭调度器
}
}
比较:java.util.concurrent.ScheduledThreadPoolExecutor比java.util.Timer更加灵活和高效。
2. Spring Task
(1) xml配置方式实现
TaskJob.java:
@Service
public class TaskJob {
public void job1() {
System.out.println("指定Spring定时任务1, now: " + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date()));
}
}
spring.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
...
xsi:schemaLocation="
...
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<!-- 自动注入定时任务组件 -->
<context:component-scan base-package="xxx" /> <!-- 定义定时任务调度策略 -->
<task:scheduled-tasks>
<task:scheduled ref="taskJob" method="job1" cron="0/1 * * * * ?" />
</task:scheduled-tasks>
</beans>
(2) 注解方式实现
TaskJob2.java:
@Component
public class TaskJob2 {
/**
* 每隔一秒执行一次
*/
@Scheduled(cron="0/1 * * * * ?")
public void job2() {
System.out.println("注解方式使用spring定时任务框架, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
spring.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
...
xsi:schemaLocation="
...
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<!-- 自动注入定时任务组件 -->
<context:component-scan base-package="xxx" /> <!-- 启动注解方式的定时任务 -->
<task:annotation-driven />
</beans>
3. Quartz
Quartz是一个开源的,功能非常丰富的定时器框架,详见:http://www.quartz-scheduler.org/。
Quartz可以独立使用,也可以集成在Spring框架中,详见:http://projects.spring.io/spring-framework/。
(1) 独立使用Quartz(详见Quartz官方示例):
pom.xml:
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
定义定时任务,MyJob.java:
public class MyJob implements Job {
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("执行Quartz定时任务实现, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
调度定时任务,MyJobSheduler:
public class MyJobSheduler {
public static void main(String[] args) {
try {
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob").build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
(2) Spring集成Quartz
如:http://docs.spring.io/spring/docs/5.0.0.M4/spring-framework-reference/htmlsingle/#scheduling-quartz 。
【实现比较】
| 实现方式 |
优点 | 缺点 |
| JDK组件 | 无需引入第三方依赖,控制灵活 | 仅支持简单任务调度,不支持指定日期等复杂定时任务 |
| SpringTask | 功能相对JDK方式全面(简单或指定日期等复杂任务调度),支持注解和配置2种方式 |
Spring 3.x及以上版本才支持,详见: http://www.springframework.org/schema/task,无法灵活控制任务启动或停止 |
| Quartz | 开源,功能全面且强大(简单或指定日期等复杂任务调度),可独立使用,也可以与Spring集成 必须在项目中引入quartz依赖 | 在项目中必须引入quartz依赖 |
【使用总结】
1. J2EE项目
-- 未依赖Spring框架,建议使用Quartz。
-- 引入了Spring 3.x+,如果仅需要简单定时任务控制,建议使用Spring Task;否则建议使用Quartz。
-- 特别地,在Spring Boot项目中,根据需求可以灵活选择JDK,Spring Task或者Quartz。
2. 非J2EE项目
-- 简单定时任务控制,建议使用JDK实现:java.util.concurrent.ScheduledThreadPoolExecutor;否则建议使用Quartz。
附:在Linux环境下,可以直接使用crontab程序实现简单的定时任务,比如定时全量备份MySQL数据库。

详见:https://wiki.archlinux.org/index.php/Cron_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
crontab在线调试工具:https://crontab.guru/
【参考】
http://gong1208.iteye.com/blog/1773177 Spring定时任务的几种实现
http://www.cnblogs.com/liuyitian/p/4108391.html Spring cron 表达式
http://blog.csdn.net/ethanzhao/article/details/4406017 Linux crontab 命令格式与详细例子
java定时器实现总结的更多相关文章
- java定时器和多线程实践记录
这几天因为需要测试mongodb读写分离的问题,因此写了个定时查询程序,并且用到了多线程,以达到定时启动多个线程查询数据库的效果,下边代码记录备忘: package timmer; import ja ...
- java定时器,Spring定时器和Quartz定时器
一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...
- Java定时器:Timer
项目中往往会遇到需要定时的任务,例如订单,当用户在某个规定时间内没有操作订单时,订单状态将会发生改变. 那么在这种情况下,我们会用到定时器. 举例: import java.util.Timer; / ...
- Java定时器应用
在Java多线程中,有的时候,我们需要按照指定间隔时间来执行一些任务,这时,我们就要用到定时器.我们在这里以Java中的Timer定时器为例,演示定时器的应用. 请看下述代码: import java ...
- Java定时器TimeTask
package com.alan.timer; import java.util.Calendar;import java.util.Date;import java.util.Timer;impor ...
- Java定时器Timer
Java定时器Timer在JDK库中,Timer类主要负责计划任务的功能,也就是在指定的时开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类,执行计划任 ...
- [Java定时器]用Spring Task实现一个简单的定时器.
今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...
- 关于java 定时器的使用总结
直接上代码,代码中有注释(代码中还有一些本人的其他测试,读者可以忽略不计).读者在代码中发现了bug,欢迎指正. package j2se.system.test; import java.text. ...
- java定时器的使用
定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后 ...
随机推荐
- iptable四表五链
链(内置): PREROUTING:对数据包作路由选择前应用此链中的规则: INPUT:进来的数据包应用此规则链中的策略: FORWARD:转发数据包时应用此规则链中的策略: OUTPUT:外出的数据 ...
- 【CF487E】Tourists(圆方树)
[CF487E]Tourists(圆方树) 题面 UOJ 题解 首先我们不考虑修改,再来想想这道题目. 我们既然要求的是最小值,那么,在经过一个点双的时候,走的一定是具有较小权值的那一侧. 所以说,我 ...
- Dynamic CRM 2015学习笔记(2)更改系统显示语言
默认装的是英文的系统,想换成中文的.下面列出操作步骤: 1. 下载并安装语言包 http://www.microsoft.com/en-US/download/details.aspx?id=4501 ...
- zabbix3.2监控mysql
应用环境:ZABBIX一款强大的企业级可分布式的开源监控工具,从2.2版本开始支持MySQL监控(自带监控模板), 不过,默认添加MySQL模板后是无法使用的,这里小记一下部署监控MySQL的简单全过 ...
- Docker系列教程05 容器常用命令
https://mp.weixin.qq.com/s?__biz=MzI4ODQ3NjE2OA==&mid=2247483890&idx=1&sn=2721f08624e6de ...
- 【UVA1194】Machine Schedule
题目大意:给定 N 个任务和两台机器,每个任务可以在任意一台机器上执行,每台机器有 N 个启动状态,不同任务需要机器在不同的状态下执行,求执行所有任务需要多少个不同的状态. 题解:由于一个任务一定要被 ...
- 用 Homebrew 带飞你的 Mac
文章目录 资料 安装 基本用法 源镜像 Homebrew也称brew,macOS下基于命令行的最强大软件包管理工具,使用Ruby语言开发.类似于CentOS的yum或者Ubuntu的apt-get,b ...
- [luogu3709][大爷的字符串题]
题目链接 题意 一天做到两道这种题目描述如此神仙的题也是够了.真锻炼语文能力. 题目的意思其实就是,给你一个序列,然后每次询问一个区间.使得尽量按照严格上升的顺序从这个区间内取数.如果当前取得数字小于 ...
- ERRORS: ?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
Ubuntu下,运行django项目的时候失败,报错: (env36) root@JD:~/xueyiwang# python manage.py runserver 0.0.0.0:8000 Per ...
- Springboot+WebSocket+Kafka(写着玩的)
闹着玩的来源:前台发送消息,后台接受处理发给kafka,kafka消费者接到消息传给前台显示.联想到websocket. 最终效果如图: 页面解释: 不填写内容的话,表单值默认为Topic.Greet ...