一、什么是定时任务调度

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

二、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的缺陷

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

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

  1. Java——定时任务调度工具

    一.什么是定时任务调度? 1.常用的定时调度工具:Timer和Quartz 二.Timer简介 1.Timer的定义以及架构 2.Timer示例 三.Timer的定时调度函数 1.schedule的四 ...

  2. Java定时任务调度工具Timer Quartz

      -----------------------------------Timer PS:Timer是 jdk中的:Quartz是第三方的 PS:也即是返回执行任务时候的时间 ----------- ...

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

    Timer与Quartz的区别有三点: 1.出身不同:Timer由jdk直接提供,调用方式简单粗暴,不需要其它jar包支持.Quartz并非jdk自带,需要引入相应的jar包 2.能力区别:主要体现在 ...

  4. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  5. Java定时任务调度详解

    前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券 ...

  6. JAVA定时任务调度之Timer入门详解(一)

    所谓的Timer,打开jdk的api文档可以看到它的定义:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.通俗点讲就是说:有且仅有一个后台线程对多个业务线程进行 ...

  7. java定时任务调度框架

    java定时任务目前主要有三种: Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在 ...

  8. java定时任务调度-Timer(1)

    一.定义 有且仅有一个后台线程对多个业务线程进行定时定频率的调度 二. Timer  ---->  Timer Task  (中有run();方法) 通过 new Timer().schedul ...

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

    郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工   没有JobCenter时我们要面对的:   电商业务链条很长,业 ...

随机推荐

  1. install apache-activemq

    进入bin/linux-x86-64下 cd apache-activemq-5.14.1/bin/linux-x86-64/ 启动 ./activemq start 五.启动成功后,访问 activ ...

  2. Beta冲刺阶段3.0

    1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 成员 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难 具体贡献 郑晓丽 完成"我的活动&quo ...

  3. maven 知识

    1. maven 环境配置 Maven 3.3 要求 JDK 1.7 或以上   Maven 3.2 要求 JDK 1.6 或以上   Maven 3.0/3.1 要求 JDK 1.5 或以上 2. ...

  4. hdu5441 并查集+克鲁斯卡尔算法

    这题计算 一张图上 能走的 点对有多少个  对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...

  5. Sql日期时间格式转换[zhuan]

    sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...

  6. MySQL 查询表中某字段值重复的数据

    MySQL中,查询表(dat_bill_2018_11)中字段(product_id)值重复的记录: ; 说明:先用GROUP BY 对 product_id 进行分组,同时使用COUNT(*)进行统 ...

  7. linux环境下安装qt过程

    linux(虚拟机fedora9)环境下安装qt的过程主要是按照下面几网页上的教程完成的. http://mobile.51cto.com/symbian-272869.htm http://www. ...

  8. flask 单个表单多个提交按钮

    单个表单多个提交按钮 在某些情况下,可能需要为一个表单添加多个提交按钮.比如在创建文章的表单中添加发布按钮和存草稿的按钮.当用户提交表单时,需要在视图函数中根据按下的按钮来做出不同的处理. 下面例子中 ...

  9. linux基础命令---显示进程ps

    ps ps指令可以显示系统中当前进程的信息,它的输出结果是高度可定制的.如果您希望重复更新所选内容和显示的信息,请使用top(1)代替. 请注意,“ps-aux”与“ps aux”不同.POSIX和U ...

  10. php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小

    php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小 UNIX时间戳转换为日期用函数: date() ,date('Y-m-d H:i:s', 1500219870); 日 ...