首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 核心技术 >> 高级编程 >> 正文

java.util下的Timer,TimerTask和quartz的比较

    Java 中已经有一个 timer 类可以用来进行执行计划,定时任务。我们所要做的只是继承 java.util.TimerTask 类。如下所示:

    package com.yourcompany.scheduling;

    import java.util.Calendar;

    import java.util.Date;

    import java.util.Timer;

    import java.util.TimerTask;

    public class ReportGenerator extends TimerTask {

    public void run() {

    System.out.println("Generating report");

    //TODO generate report

    }

    }

    class MainApplication {

    public static void main(String[] args) {

    Timer timer new Timer();

    Calendar date = Calendar.getInstance();

    date.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);

    date.set(Calendar.HOUR, 0);

    date.set(Calendar.MINUTE, 0);

    date.set(Calendar.SECOND, 0);

    date.set(Calendar.MILLISECOND, 0);

    // Schedule to run every Sunday in midnight

    timer.schedule(new ReportGenerator(),  // TimerTask

    date.getTime(),          // Timer

    1000 * 60 * 60 * 24 * 7   // delay)

    };

    这里有几个问题,我们的类继承了TimerTask ,而timerTask 也是实现了 java.lang.Runnable 接口。我们所要做的只是在我们自己的类里重置 run() 方法。所以我们的TimerTask类其实是一种线程,但线程的调度往往不是按照我们希望来实现的,因为一些垃圾收集等原因,我们计划的时间点,却没有执行必要的任务。这样会产生一些问题。虽然,Timer 类也提供了scheduleAtFixedRate() 方法用来在垃圾收集后能够快速的追上任务进度,但这个不一定是我们所需要的。特别是在 一些 J2EE 服务器上 Timer 是无法控制的,因为它不在容器的权责范围内。另外的,这个任务调度也缺乏一些企业级所需要的 特殊 日期定制的功能,以及修改,查找任务的功能。

    这里我们要介绍的是一个开源项目:Quartz .

    Quartz 定义了两种 基本接口 Job 和 Trigger . 看名字也就知道,我们的任务必须实现 Job, 我们的时间触发器定义在 Trigger 内。 看一个例子也许能更快的了解他的使用方法:package com.yourcompany.scheduling;

    import org.quartz.*;

    public class QuartzReport implements Job {

    public void execute(JobExecutionContext cntxt) //必须实现的方法

    throws JobExecutionException {

    System.out.println("Generating report - " +

    cntxt.getJobDetail().getJobDataMap().get("type"));

    //TODO Generate report

    }

    public static void main(String[] args) {

    try {

    SchedulerFactory schedFact

    new org.quartz.impl.StdSchedulerFactory();

    Scheduler sched = schedFact.getScheduler();

    sched.start();

    JobDetail jobDetail = new JobDetail("Income Report",       // 任务名

    "Report Generation", // 任务组

    QuartzReport.class    //任务执行的类

    );

    jobDetail.getJobDataMap().put("type","FULL");

    CronTrigger trigger new CronTrigger(

    "Income Report",              //触发器名

    "Report Generation"          //触发器组

    );

    trigger.setCronExpression(     // 触发器时间设定

    "0 0 12 ? * SUN"

    );

    sched.scheduleJob(jobDetail, trigger); // 执行任务

    }

     catch (Exception e) {

    e.printStackTrace();

    }

 

[1] [2] [3] 下一页

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航