java定时任务调度工具

一、什么是定时任务调度

  基于给定的时间点,给定的时间间隔或者给定的时间执行次数自动执行的任务。

二、java中常用的定时任务调度工具:

  • Timer
  • Quartz  

2.1两者区别:

  • Timer源自jdk,Quartz需要额外引入jar包。
  • Timer功能少,使用方便,能解决许多常见问题。Quartz功能强大,使用麻烦,能解决几乎所有问题。
  • Timer底层通过线程执行定时任务。Quartz底层通过多个线程池执行定时任务。

2.2Timer简介

定义:有且仅有一个后台线程多个业务线程,进行定时定频率的调动

构建:Timer有四个组成部分:

  • Timer:定时任务调度工具主类。
  • TimerTask:定时任务,里面有run方法
  • TimerThread:后台负责执行的定时线程
  • TaskQueue:定时任务队列

  其中最重要的部分为Timer和TimerTask。

Timer使用方法:

/**
 * 定义TimerTask
 */
class MyTimerTask extends TimerTask{

    private String name;

    public MyTimerTask(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void run() {
        System.out.println("current exec name:" + new Date() + "  " + name);
    }
}
public class Main {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        //1.创建一个timer
        Timer timer = new Timer();
        //2.创建一个timerTask
        TimerTask task = new MyTimerTask("first");
        //设定调用频率
//        timer.schedule(task, sdf.parse("2018/3/24 10:42:30"));//Date time  在执行的时间执行,如果时间已经过去了,则会立即执行。不会重复执行
//        timer.schedule(task, 1000L);//Long delay  延迟指定的毫秒数后执行。不会重复执行
//        timer.schedule(task, sdf.parse("2018/3/24 10:42:30"), 1000L);//Date firstTime, Long period 指定第一次的执行时间,如果时间已经过去了,则会立即执行,之后在指定的毫秒数后再次执行
//        timer.schedule(task, 2000L, 1000L);//Long delay, Long period  第一次执行延迟delay毫秒,之后每隔period秒重复执行。
//        timer.scheduleAtFixedRate(task, sdf.parse("2018/3/24 10:50:10"), 10000L);//指定第一次的执行时间,之后在指定的毫秒数后再次执行,如果时间已经过去了,会对这期间的线程进行补充执行,存在并发的可能
        timer.scheduleAtFixedRate(task, 1000L, 10000L);

    }
}

在Timer类中,执行定时任务的方法名主要分为scheduleAtFixedRate和schedule。两者区别:

1、schedule方法不会对错过的任务补充执行。scheduleAtFixtedRate发发会对错过的任务进行补充执行。

例如:假如有定时任务12:00:00执行,之后每2秒重复执行。但当前时间已经是12:10:00。则schedule会立即对task执行一次,之后每间隔两秒重复执行,scheduleAtFixedRate会立即对task执行10*60/2次,之后会以12:00:00的间隔时间开始执行。

2、schedule重复执行的时间从上一次任务执行结束时间开始。scheduleAtFixedRate重复执行的时间从上一次任务开始执行的时间开始。

例如:有定时任务执行需要6秒的时间,两次任务之间的间隔是5秒。则schedule第一次执行时间12:00:00,第二次执行时间12:00:11。scheduleAtFixedRate第一次执行时间12:00:00,第二次执行时间12:00:05。

综上,使用scheduleAtFixedRate时,需要考虑线程并发的问题。

其他的重要方法:

  TimerTask.cancel():执行本地task后,取消当前定时任务调度。

  TimerTask.schedule():返回最近执行这项任务被调度的时间。

  Timer.cancel():终止当前定时器,取消定时器内所有的待执行任务。

  Timer.purge():从定时器中移出所有已取消的任务,返回取消数量。

2.3Timer的缺陷

  • 由于只有一个后台线程,因此不支持多线程并发。即如果一个定时器中有多个定时任务,同一时间开始执行,则它们的开始执行时间不一定相同。
  • 当其中一个任务抛出运行时异常,整个定时器会停止所有任务将抛出异常。

原文地址:https://www.cnblogs.com/yxth/p/8638582.html

时间: 2024-08-29 12:29:13

java定时任务调度工具的相关文章

java定时任务调度工具Timer与Quartz的区别

Timer与Quartz的区别有三点: 1.出身不同:Timer由jdk直接提供,调用方式简单粗暴,不需要其它jar包支持.Quartz并非jdk自带,需要引入相应的jar包 2.能力区别:主要体现在对时间的控制上.某个具体时间执行具什么任务的话Timer可以轻松搞定,而比如每个星期天早上八点提醒做某事的功能就需要Quartz,因此Quartz对时间的控制远比Timer强大,完善 3.底层机制:

JAVA定时任务调度之Timer入门详解(二)

在上篇的JAVA定时任务调度之Timer入门详解(一)文章中,主要介绍了下Timer,接下来我们一起来看看Timer的一些常用方法. 1.schedule()的4种用法. 第一种:schedule(TimerTask task, Date time); task:安排的任务,time:具体执行时间.这个函数表达的意义是:在时间等于或超过time的时候执行且执行一次task.测试内容如下 MyTimerTask.java的代码跟第一篇一样,MyTimer.java的部分代码截图如下: 运行后,控制

Java定时任务调度详解

前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券:比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作:比如一些定时需要生成的报表.邮件:比如一些需要定时清理数据的任务等.本篇博客将系统的介绍定时任务调度,会涵盖Timer.ScheduledExecutorService.开源工具包Quartz,以及Spring和Quartz的结合

#研发中间件介绍#定时任务调度与管理JobCenter

郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工 没有JobCenter时我们要面对的: 电商业务链条很长,业务逻辑也较为复杂,需要成百上千种定时任务.窝窝的大多数定时任务其实调用的是本地或远端 Java/PHP/Python Web Service.如果没有一个统一的调度和报警,在集群环境下,我们会: 不知道哪一个定时任务执行失败或超时,不见得能第一时间知道——直到最终用户投诉反馈过来: 要求每一个定时任务输出统

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器,整合ehcache环境,只需要配置即可.     <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享

点击链接加入群[JavaEE(SSH+IntelliJIDE+Maven)]:http://jq.qq.com/?_wv=1027&k=L2rbHv 一:quartz简介 OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案. Quartz 是个开源的作业调度框架,定时调度器,为在 Java 应用程序中进行作业调度提供了简单却强大的机制. Quartz中有两个基本概念:作业和触发器.作业是能够调度的可执行任务,触发器提供了对作业的调度 二:quartz spring配置详

Spring整合Quartz实现定时任务调度

一. 核心类 1. Job: 表示一个工作, 具体的业务处理都在这里. 2. JobDetail: 表示一个具体的可执行的调度程序. 3. Trigger: 用于调度参数的配置(什么时候去调用Job). 4. Scheduler: 表示一个调度容器, 容器中有一个线程池, 用来并行调度执行每个作业, 一个调度容器中可以注册多个JobDetail和Trigger. 二. 整合spring 1. 代码结构图: 2. applicationContext.xml <?xml version="1

Java 性能分析工具 , 第 2 部分:Java 内置监控工具

引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工具,其中包括: jcmd:打印一个 Java 进程的类,线程以及虚拟机信息.适合用在脚本中.使用 jcmd - h 来查看使用方法. jconsole:提供 JVM 活动的图形化展示,包括线程使用,类使用以及垃圾回收(GC)信息. jhat:帮助分析内存堆存储. jmap:提供 JVM 内存使用信息

spring timetask 定时任务调度

作者:Garry1115 定时任务调度即在设置的特定时间执行特定的任务,不需要人工干预. spring timertask spring 自身所带定时任务类,不需要引入第三方jar包,使用方式如下: EmailReportTask.java package com.zwx.core; import java.util.TimerTask; public class EmailReportTask extends TimerTask{ @Override public void run() { S