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

Java多线程-----定时器(Timer)及其实现 阅读详情
 
java.util下的Timer,TimerTask和quartz的比较
2007-02-12 16:49
  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();

    }

这里面我们可以看到,当我们定义了任务执行 QuartzReport 类后,需要定一个Scheduler类用来执行计划任务。

    一个JobDetail 类来描述这个任务的信息,包括任务信息,任务所在组,任务执行的类。

    然后还要定义一个 触发器,类似的也包括触发器名,触发器所在组,触发器触发时间设定。

    最后是调度器Scheduler类执行计划任务。基本上一个计划任务执行的流程就完成了。

    当然,我们还看到了上面红色代表的内容,这些内容主要是提供在job方法执行的时候所需要的参数的提供。这里使用了JobDataMap 类,它其实就是实现了map的特殊应用的一个类,使用方法与Map 很相似。我们可以用 put() 输入参数。在Job类中使用cntxt.getJobDetail()。getJobDataMap()。get("type") 方法获取输入的参数的值。这里的cntxt 是 JobExecutionContext .就是包含任务执行上下文的一个信息类。这样我们的一个基本的任务执行就可以搞定了。

    触发器有两类:SimpleTrigger andCronTrigger. .SimpleTrigger主要提供了跟 java.util.Timer 类相似的功能……你可以在里面定义 任务的起始时间,终止时间,任务的执行次数,任务执行的中间间隔 . 而 CronTrigger类主要提供了更高级的任务调度时间设置,例如 每个星期天的早上7点  . CronTrigger的时间设置说明在最后来介绍。

    下面我们介绍一下在 J2EE 环境下如何来使用 Quartz .

    首先,我们要配置 web.xml ,添加 一下内容,主要是Quartz 的初始化,

    <servlet>

    <servlet-name>QuartzInitializer</servlet-name>

    <display-name>Quartz Initializer Servlet</display-name>

    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

    </servlet>

    然后还要有一个Quartz 的配置文件 quartz.properties 放置在 WEB-INF/classes目录下面。StdScheduleFactory()会读取它。配置如下#

    # Configure Main Scheduler Properties 

    #

    org.quartz.scheduler.instanceName = TestScheduler

    org.quartz.scheduler.instanceId = one

    #

    # Configure ThreadPool 

    #

    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

    org.quartz.threadPool.threadCount = 5 

    org.quartz.threadPool.threadPriority = 4

    #

    # Configure JobStore 

    #

    org.quartz.jobStore.misfireThreshold = 5000 

    org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

    这里我们使用的 RAMJobStore 存储方式,这样如果我们的web服务器重启的话,我们所有未执行的任务信息都回丢失。当然,我们也有另外的选择,我们可以把这样的信息存储在数据库内,就是使用 JDBCJobStoreTX

    # 

    # Configure ThreadPool 

    # 

    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate 

    org.quartz.jobStore.dataSource = myDS org.quartz.jobStore.tablePrefix = QRTZ_

    #

    # Configure Datasources

     #

    org.quartz.dataSource.myDS.driver = org.postgresql.Driver 

    org.quartz.dataSource.myDS.URL = jdbc:postgresql:dev 

    org.quartz.dataSource.myDS.user = dejanb 

    org.quartz.dataSource.myDS.password = org.quartz.dataSource.myDS.maxConnections 5

附:cronExpression配置说明 

字段 

  

允许值 

  

允许的特殊字符 

秒 

  

0-59 

  

, - * / 

分 

  

0-59 

  

, - * / 

小时 

  

0-23 

  

, - * / 

日期 

  

1-31 

  

, - * ? / L W C 

月份 

  

1-12 或者 JAN-DEC 

  

, - * / 

星期 

  

1-7 或者 SUN-SAT 

  

, - * ? / L C # 

年(可选) 

  

留空, 1970-2099 

  

, - * / 

Cron 的小小说明 

"0 0 12 * * ?" 

Fire at 12pm (noon) every day 

"0 15 10 ? * *" 

Fire at 10:15am every day 

"0 15 10 * * ?" 

Fire at 10:15am every day 

"0 15 10 * * ? *" 

Fire at 10:15am every day 

"0 15 10 * * ? 2005" 

Fire at 10:15am every day during the year 2005 

"0 * 14 * * ?" 

Fire every minute starting at 2pm and ending at 2:59pm, every day 

"0 0/5 14 * * ?" 

Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day 

"0 0/5 14,18 * * ?" 

Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day 

"0 0-5 14 * * ?" 

Fire every minute starting at 2pm and ending at 2:05pm, every day 

"0 10,44 14 ? 3 WED" 

Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. 

"0 15 10 ? * MON-FRI" 

Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday 

"0 15 10 15 * ?" 

Fire at 10:15am on the 15th day of every month 

"0 15 10 L * ?" 

Fire at 10:15am on the last day of every month 

"0 15 10 ? * 6L" 

Fire at 10:15am on the last Friday of every month 

"0 15 10 ? * 6L" 

Fire at 10:15am on the last Friday of every month 

"0 15 10 ? * 6L 2002-2005" 

Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005 

"0 15 10 ? * 6#3" 

Fire at 10:15am on the third Friday of every month 

Java定时任务详解 在Java开发中,定时任务是一个常见的需求,比如定时备份数据、定时清理日志、定时发送邮件等。Java提供了多种实现定时任务的方式,本文将详细介绍Java中定时任务的实现方式、底层逻辑、使用方法以及示例代码。Timer 和 TimerTask:简单易用,但功能有限,不适合复杂场景。ScheduledExecutorService:基于线程池,提供了更好的性能和灵活性。Spring Task Scheduler:适合Spring项目,简化了定时任务的开发。 阅读详情

相关推荐

Timer和Quartz的区别

Timer和Quartz的区别 1、Timer是java.util包自带的定时器,quartz是一个第三方提供的定时器 2、Timer的任务是通过创建TimerTask子类进行实现,quartz则必须要新建一个class文件实现Job接口重写execute方法定义任务 3、Timer只能控制执行的周期及开始时间,而quartz可以灵活、准确的控制日期节点以及执行次数 定时器 常见的定时器分两大块: 1、Timer 在java.util包中提供的定时器 2、quartz 第三方提供的 定时器就像

qq_52232797的博客 1264

【Java】定时任务 - Timer/TimerTask 源码原理解析

【Java】定时任务 - Timer/TimerTask 源码原理解析

blblccc 1255

S32K3 MCAL配置 【MCU、PORT、DIO】

1、s32k3时钟源可由PLL, FXOSC, FIRC, SIRC, and SXOSC五种时钟源生成,可按照手册推荐配置。目标是在在S32K344板子上点亮红色LED灯,需要配置的有MCU、PORT、DIO模块。MCU最主要的是时钟配置,要翻看芯片手册,理解时钟树。1、通用配置中,没有什么特殊需求按照demo配置就好。1、配置MC_CGM mux 0 clocks时钟。1、外部晶振配置按照实际项目原理图进行配置。1、外部晶振配置,按照实际项目配置。1、PLL时钟按照手册进行配置。

weixin_43741076的博客 3245

java.util.Timer详解

摘要:java.util.Timer是JDK提供的定时任务工具类,采用单线程+任务队列机制实现。核心组件包括TaskQueue(基于堆结构的优先队列)和TimerThread(执行线程)。Timer启动时创建线程并进入主循环,当队列为空时阻塞,添加新任务时会唤醒线程。任务调度通过sched()方法实现,将TimerTask加入队列并设置执行时间,线程获取任务后根据时间判断立即执行或等待。这种设计实现了简单的定时任务调度功能,但存在单线程处理的性能局限。

沐雨橙风ιε的博客 597

Ubuntu20.04下Intel RealSense D435i相机驱动配置全攻略(含ROS Noetic适配)

本文详细介绍了在Ubuntu20.04系统下配置Intel RealSense D435i相机驱动的完整流程,包括libRealsense SDK 2.0安装、ROS Noetic适配及常见问题解决方案。通过实战指南帮助开发者快速实现深度相机与ROS的集成,适用于机器人视觉和SLAM应用开发。

weixin_29281915的博客 512

Tesseract-Ocr踩坑下载以及进行检验

1 OCR,即Optical Character Recognition:光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。下载完成后进行解压找到这两个,然后复制到之前下载Tesseract-Ocr的tessdata文件下。可能会出现报错说chi下载的问题咱们不用管继续ok让它先下载完毕,后续会有下载chi的步骤。四、检验tesseract使用(将以下图片进行下载我这里将以下图片命名为3.png)我这里选的是2024年的版本如果下载不了;4 在安装的时候(找到下载的exe文件,双击)

m0_51428325的博客 1915

Java定时任务java.util.Timer.Timer和java.util.TimerTask详解

1.java.util.TimerTask类 public abstract class TimerTask implements Runnable 可由一个定时器进行一次或多次执行的任务。 scheduledExecutionTime方法返回任务最近执行的时间 cancel方法是停止任务执行 public static void main(String[] args) ...

OceanSky的专栏 5660

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

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

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

weixin_30444573的博客 187

目前最强的价格行为技术分析AI!大A也能用!还免费!

有球友推荐了一个历史最强的价格行为技术分析AI工具,使用下来确实很惊艳,解决了 很多AI工具黑盒过程,难以回溯的问题,他的决策过程可解释,提供决策树、诊断结果、原始响应、调试信息和未来走势预期。用户能够看到模型为什么选择“做多、做空或不下单”。会检查置信度、入场条件、盈亏比、结构失效和冷却期。最大的优点不是“预测一定准确”,而是把主观的价格行为分析整理成了可重复、可解释、可校验、可持续跟踪的工程化流程。本文记录本项目在 Windows 上的实际部署与启动方法。

木头大左的博客 76

Python 爬虫实战:去哪儿网机票价格爬取与出行比价分析

本文介绍了一个基于Python的机票价格监控系统,通过爬取去哪儿网数据实现多航线查询与智能比价。系统采用requests+BeautifulSoup+selenium技术栈,具备以下功能: 实时查询指定航线价格 历史价格追踪与分析 最低价推荐与价格预警 数据可视化展示 文章详细解析了去哪儿网的页面结构和反爬机制,提供了Selenium浏览器的完整配置方案,并实现了一个可稳定运行的机票采集爬虫。该系统能帮助用户掌握价格波动规律,选择最优购票时机,每年可节省可观的出行成本。

u014481728的博客 671

Spring+Quartz && Java.util.Timer 实现定时任务

Spring+Quartz && Java.util.Timer 实现定时任务

Davie's Happy Life 3219

机器学习笔记:估算模型训练所需的样本量的方法

相反,如果训练得分高而交叉验证得分低,那么模型可能存在过拟合问题,需要更多的样本来提高泛化能力。本文将介绍一些常用的方法来估算模型训练所需的样本量,并提供相应的源代码。除了经验法则和学习曲线法,还有一些统计学方法可以用于估算模型训练所需的样本量。学习曲线是一种通过绘制模型性能与样本量之间的关系曲线来估算样本量的方法。需要注意的是,这些方法仅提供了估算样本量的指导,具体的样本量仍然需要根据实际情况进行调整和优化。通过合理估算样本量,可以提高机器学习模型的性能和泛化能力,从而更好地应用于实际问题中。

HnrzLinux的博客 2732

java quartz timer_定时器篇---java.util.TimerTask和quartz

最近项目中出现了定时执行任务的东西,研究了一下,觉得挺不错的,以后还用得到,就总结了下。这里只介绍两种java.util.Timer 和 quartzjava.util.Timerjava自带的工具类,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,与java.util.TimerTask一起使用,容易使用。示例代码如下:importjava.util.Timer;i...

weixin_33212486的博客 216

一文读懂OpenClaw:核心组件与工作原理深度解析

Agent核心:负责理解意图、规划任务、协调执行消息系统:统一的消息格式,实现组件间解耦工具注册表:可扩展的工具系统,支持自定义工具模型适配层:多模型支持,统一API接口安全机制:沙箱隔离、权限确认、操作审计性能优化:并行执行、智能缓存、增量更新理解这些核心组件和工作原理,将帮助你更好地使用OpenClaw,也为后续开发自定义扩展打下坚实基础。在下一篇文章中,我们将详细介绍OpenClaw的界面操作,包括命令行与交互模式的各种技巧。

gaoxiang_120的专栏 833

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java.util.Timer 定时问题

java.util.Timer 定时问题 相信大家都很熟悉java.util.Timer类,java类库中提供的简单的执行定时任务的类,使用也非常简单。自定义任务扩展抽象类TimeTask,实现抽象方法void run(),之后使用Timer对象的schedule( TimerTask task,long  delay,long period )方法即可。 直观的观察此函数,意思是让任务延迟d

JonnyWei的专栏 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java timer cron_java 定时任务 (timer和timetask,quartz,spring,LinuxCron)

在Java中,实现定时任务有多种方式,,Timer和TimerTask、Spring、QuartZ、Linux Cron。以上4种实现定时任务的方式,Timer是最简单的,不需要任何框架,仅仅JDK就可以,缺点是仅仅是个时间间隔的定时器,调度简单;Spring和QuartZ都支持cron,功能都很强大,Spring的优点是稍微简单一点,QuartZ的优点是没有Spring也可使用;Linux Cr...

weixin_29889741的博客 526

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享

java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享 源代码下载地址:http://www.zuidaima.com/share/1744482578500608.htm

springmvc_freemarker的博客 787

Timer定时器的详解与使用方法

Timer定时器的详解与使用方法 文章目录Timer定时器的详解与使用方法前言简介调用方法实例演示 前言 在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作。这时候我们就要去设置个定时器,Java中最方便、最高效的实现方式是用java.util.Timer工具类,再通过调度java.util.TimerTask任务。 简介 在JDK类库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。此类也常用来做一下周期性同步工作,代替它的有quartz、SpringTask

爱笑的博客 3277

java定时器timer配置_java定时器timer配置

Time定时器 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。 pr......一、原理 JDK中,定时器任务的执行需要两个基本的类: java.util.Timer; java.util.TimerTask; 要运行一个定时任务,最基本的步骤如下: 1、建立一个要执行的......首先...

weixin_39826342的博客 462

java timer的使用_java Timer 使用小结

Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。任务的调用通过起的子线程进行执行。java.util.Timerjava.util.TimerTask一、调用方法:(1)void java.util.Timer.schedule(TimerTask task, long de...

weixin_39605345的博客 167
上一篇: Timer,TimerTask简单讲解
下一篇: PL/SQL学习笔记
FutureInHands
博客等级 码龄20年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值