设为首页 加入收藏

TOP

在Java中使用定时任务的最佳实践
2014-11-24 03:14:32 来源: 作者: 【 】 浏览:2
Tags:Java 使用 定时 任务 最佳 实践

之前大部分人在遇到需要使用定时任务的时候首先会想到Timer类,用法一般就是:


new Timer("timer").schedule(new TimerTask() {
@Override
public void run() {
System.out.println("执行任务");
}
}, 1000L, 1000L);


不过在JDK5.0之后就不建议使用这个Timer了,因为它有很多的缺陷。


在新的java.util.concurrent包中的ScheduledExecutorService可以替代这个Timer:


使用方法举例:


ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable() {
public void run() {
try{
throw new RuntimeException();
}catch (Exception e){
System.out.println("RuntimeException catched");
}
}
}, 1000, 5000, TimeUnit.MILLISECONDS);


理由:


第1:Timer在执行所有定时任务的时候只会创建一个线程。如果某个任务执行时间过长,那么将破坏其他TimeTask的定时精确性。


第2:如果TimerTask抛出一个UncheckedException,那么Timer将表现出很挫的行为。Timer并不捕获异常,因此当TimerTask抛出UncheckedException时候将终止定时线程,比如常见的一个NullPointerException。这种情况下,Timer不会恢复线程执行,而是会错误的任务整个Timer都取消掉。因此,已经被调度但尚未执行的Task将不会执行了,新的任务也不会调度,也就是常见的线程泄露。


而ScheduledThreadPoolExecutor能正确处理这些表现出错误行为的任务。


因此,如果您的JDK是5.0以上的,那么建议不要使用过时的Timer类了。


最后,如果要用到高级功能,比如在某个星期的周五,在国庆节当天的几点几分,在每天凌晨几点几分执行之类的定时任务,就需要用到大名鼎鼎的Quartz框架了,一般用法:


SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
JobDetail job = newJob(SimpleJob.class)
.withIdentity("job1", "group1")
.build();

CronTrigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(cronSchedule("0/20 * * * * "))
.build();

Date ft = sched.scheduleJob(job, trigger);
sched.start();


据我所知这个就是定时任务的最佳实践了,不知道大家还有没有更好的建议。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Lua 语言 15 分钟快速入门 下一篇Linux的文件I/O编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·请问微信4.0版本xwec (2025-12-24 22:48:42)
·电脑NVIDIA的文件夹 (2025-12-24 22:48:40)
·如何看待微信新版本 (2025-12-24 22:48:37)
·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)