博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定时任务调度框架实现总结
阅读量:6524 次
发布时间:2019-06-24

本文共 2917 字,大约阅读时间需要 9 分钟。

转自:http://www.blogchong.com/post/96.html

在应用里经常都有用到在后台跑定时任务的需求。

举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等;又比如博客资讯网站需要定时更新最新最热资讯列表等;又比如后台需要定时获取数据等。

其实,不止这些场景,定时任务始终会在业务处理中占据很重要的位置,因此,熟悉定时任务框架的使用非常有必要。

通常有四种实现定时任务的方式:

(1)直接使用线程Thread来达到定时的目的

我们创建一个thread,然后让他一直while循环,并且使用sleep的方式达到定时的目的。

这种方法简单,但是略显粗暴,并且功能上也有所欠缺,难以控制定时任务启停。

简单例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package 
com.blogchong.util;
 
/**
 
* @author:blogchong
 
* @E-mail: blogchong@163.com
 
* @Version:1.0
 
* @Blog: www.blogchong.com
 
* @CreateTime:2015年4月1日 上午11:09:29
 
* @Description: Thread实现定时任务
 
*/
 
public 
class 
Timing {
 
    
public 
static 
void 
main(String[] args) {
 
        
//设置时间间隔
        
final 
long 
timeInterval = 
1000
;
         
        
Runnable runnable = 
new 
Runnable() {
             
            
public 
void 
run() {
                
while 
(
true
) {
 
                    
//执行定时
                    
System.out.println(
"Hello,blogchong~!欢迎继续关注博客虫!"
);
 
                    
try 
{
 
                        
//进入定时
                        
Thread.sleep(timeInterval);
 
                    
catch 
(InterruptedException e) {
 
                        
e.printStackTrace();
 
                    
}
                
}
            
}
        
};
         
        
Thread thread = 
new 
Thread(runnable);
        
thread.start();
    
}
 
}

(2)使用Timer和TimerTask

使用Timer类,可以调度任务,并且可以控制取消任务,第一次执行时,可以设置延迟执行时间,并且Timer类是线程安全的。

使用实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package 
com.blogchong.util;
 
/**
 
* @author:blogchong
 
* @E-mail: blogchong@163.com
 
* @Version:1.0
 
* @Blog: www.blogchong.com
 
* @CreateTime:2015年4月1日 上午11:09:29
 
* @Description: Thread实现定时任务
 
*/
 
import 
java.util.Timer;
import 
java.util.TimerTask;
 
public 
class 
Timing {
 
    
public 
static 
void 
main(String[] args) {
         
          
TimerTask task = 
new 
TimerTask() {
               
              
public 
void 
run() {
                  
System.out.println(
"欢迎关注博客虫公众微信号blogchong!"
);
              
}
            
};
             
            
Timer timer = 
new 
Timer();
            
long 
delay = 
0
;
            
long 
intevalPeriod = 
1 
1000
;
 
            
timer.scheduleAtFixedRate(task, delay, intevalPeriod);
           
    
}

(3)使用ScheduledExecutorService

在Timer的基础上,ScheduledExecutorService是通过线程池来执行的,同样支持延迟执行,提供良好的入口设置时间间隔。

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package 
com.blogchong.util;
 
/**
 
* @author:blogchong
 
* @E-mail: blogchong@163.com
 
* @Version:1.0
 
* @Blog: www.blogchong.com
 
* @CreateTime:2015年4月1日 上午11:09:29
 
* @Description: Thread实现定时任务
 
*/
 
import 
java.util.concurrent.Executors;
import 
java.util.concurrent.ScheduledExecutorService;
import 
java.util.concurrent.TimeUnit;
 
public 
class 
Timing {
 
    
public 
static 
void 
main(String[] args) {
 
        
Runnable runnable = 
new 
Runnable() {
 
            
//run里头的是执行主体
            
public 
void 
run() {
                
System.out.println(
"博客虫讲解的storm视频,马上会在极客学院上线,欢迎关注!"
);
            
}
             
        
};
 
        
ScheduledExecutorService service = Executors
                
.newSingleThreadScheduledExecutor();
        
// 设置时间间隔,如示例,0为延迟时间,1为间隔,最后一个为时间单位
        
service.scheduleAtFixedRate(runnable, 
0
1
, TimeUnit.SECONDS);
 
    
}
}

(4)使用quartz框架

quartz是一个定时任务调度框架,或者说是作业调度框架。想比与之前三种定时任务的实现,更为复杂。他不止能支持成千上百个作业任务的调度,同时它还能对所有的定时任务进行操作,比如启动,停止,暂停,查看等。

此外,quartz还支持集群的部署方式,支持多节点,通过mysql进行中间状态的保存,支持在单节点故障的情况下依然能够保证任务的正常调度。

转载于:https://www.cnblogs.com/sharpest/p/8571887.html

你可能感兴趣的文章
HDU 4611Balls Rearrangement(思维)
查看>>
[LeetCode] Majority Element II
查看>>
minGW, cygwin, GnuWin32【C++的跨平台交叉编译问题】
查看>>
我的Dll(动态链接库)学习笔记(转)
查看>>
应用程序域
查看>>
有向图的拓扑排序算法JAVA实现
查看>>
HTML页面跳转的5种方法
查看>>
ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
查看>>
李洪强-C语言5-函数
查看>>
开源监控利器grafana
查看>>
Android获取当前时间与星期几
查看>>
jenkins2 multibranch
查看>>
Css定位-定位
查看>>
sort,uniq命令
查看>>
am335x 电容屏驱动添加。
查看>>
JavaScript Unicode字符操作
查看>>
rhel-server-7.2-x86_64无法联网(VMware环境)
查看>>
Nginx配置中的log_format用法梳理(设置详细的日志格式)
查看>>
Atitit 软件工程概览attilax总结
查看>>
优化LibreOffice如此简单
查看>>