一、什么是定时任务调度?

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

1、常用的定时调度工具:Timer和Quartz

对时间的控制上,能实现简单的定时任务。

若特定时间的定时任务,需要用Quartz,它的定时机制更加庞大。

Quartz可以使用多个执行线程来实现。

二、Timer简介

1、Timer的定义以及架构

Timer定义:java.lang.object,是java.util.Timer包下。

一个后台的线程,后台线程支持多个目录定时执行。

有且仅有一个后台线程多个业务线程进行定时定频率的调度。

主要构件:

Timer——>定时调用——>TimerTask(业务线程)。

TimerThread后台执行的线程。

TimerTask对应的业务线程, TimerThread通过定期的调用TimerTask的run方法来实现定时调度。

2、Timer示例

import java.util.TimerTask;

public class MytimerTask extends TimerTask{
private String name;
//添加name的set和get方法
public MyTimerTask(String inputname){
name=inputname;
} @Override
public void run(){
//打印输出内容:
out.print("test"+name);
}
}
public class Mytimer{

    public static void main(String[] args){
//1:创建一个timer实例
Timer timer = new Timer();
//2:创建一个MyTimerTask实例
MyTimeTask myTimerTask = new MyTimerTask("No.1");
//3:通过timer定时定频率调用MyTimerTask的业务逻辑
//即第一次执行是在当前时间的两秒之后,之后每隔一秒钟执行一次
timer.schedule(myTimerTask,2000L,1000L);
}
}

三、Timer的定时调度函数

1、schedule的四种用法

①、chedule(task,time):参数:

  • task - 所要安排的任务
  • time - 执行任务的时间

作用:在时间等于或超过time的时候执行切仅执行一次task;

②、schedule(task,time,period):参数

  • task - 所要安排的任务
  • time - 执行任务的时间
  • period - 执行一次task的时间间隔,单位是毫秒

作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。

③、schedule(task,delay):参数

  • task - 所要安排的任务
  • delay - 执行任务前的延迟时间,单位是毫秒

作用:等待delay毫秒后执行且仅执行一次task。

④、 schedule(task,delay,period):参数

  • task - 所要安排的任务
  • delay - 执行任务前的延迟时间,单位是毫秒
  • period - 执行一次task的时间间隔,单位是毫秒

作用:等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task。

import java.util.TimerTask;

public class MytimerTask extends TimerTask{
private String name;
//添加name的set和get方法
public MyTimerTask(String inputname){
name=inputname;
} @Override
public void run(){
//以yyyy-MM-dd HH:mm:ss的格式打印当前执行时间
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//打印当前执行时间
out.print("当前时间:"+sf.format(calendar.getTime())); //打印name:
out.print("test"+name);
}
}
public class Mytimer{

    public static void main(String[] args){
//1:创建一个timer实例
Timer timer = new Timer();
//2:创建一个MyTimerTask实例
MyTimeTask myTimerTask = new MyTimerTask("No.1");
//3:通过timer定时定频率调用MyTimerTask的业务逻辑
//即第一次执行是在当前时间的两秒之后,之后每隔一秒钟执行一次
//timer.schedule(myTimerTask,2000L,1000L); Calendar calendar = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//打印当前执行时间
out.print("当前时间:"+sf.format(calendar.getTime()));
//设置3秒之后的时间
calendar.add(Calendar.SECOND,3); //schedule的用法
/**
* 1、在时间等于或超过time的时候执行且仅执行一次task
/ myTimerTask.setName("schedule1");
timer.schedule(myTimerTask,calendar.getTime()); /**
*2、时间等于或超过time时首次执行task
*之后每隔period毫秒重复执行一次task
/
myTimerTask.setName("schedule2");
//每隔2秒钟,重复执行myTimerTask方法中的run方法
timer.schedule(myTimerTask,calendar.getTime(),2000);
} /**
*3、等待delay毫秒后执行且仅执行一次task
*如现在是00:00:00
*则在00:00:01执行一次task,打印任务的名字
/
myTimerTask.setName("schedule3");
timer.schedule(myTimerTask,1000); /**
*4、等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
/
myTimerTask.setName("schedule4");
timer.schedule(myTimerTask,3000,2000); }

2、scheduleAtFixedRate的两种用法

scheduleAtFixedRate(task,time,period) :参数

- task - 所要安排的任务

- time- 首次执行任务的时间

- period - 执行一次task的时间间隔,单位是毫秒

作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。

scheduleAtFixedRate(task,delay,period) :参数

- task - 所要安排的任务

- delay- 执行任务前的延迟时间,单位是毫秒

- period - 执行一次task的时间间隔,单位是毫秒

作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。

    /**
*1、时间等于或超过timer时首次执行task,之后每隔period毫秒重复执行一次task
/
myTimerTask.setName("scheduleAtFixedRate1");
timer.scheduleAtFixedRate(myTimerTask,calendar.getTime(),2000); /**
*2、等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
/
myTimerTask.setName("scheduleAtFixedRate2");
timer.scheduleAtFixedRate(myTimerTask,3000,2000);

四、其他重要函数

1、TimerTask的cancel(),scheduleExecutionTime()

cancel():

作用:取消当前TimerTask里的任务

//计时器
private Integer count=0; void run(){
if(count < 3){
//业务 count++;
}else{
//任务取消
cancel();
}
}

scheduleExecutionTime():

作用:返回此任务最近实际执行的已安排执行的时间

返回值:最近发生此任务执行安排的时间,为long型。

    myTimerTask.setName("schedule");
timer.scheduleAtFixedRate(myTimerTask,3000);
out.print("test":sf.format(myTimerTask.scheduleExecutionTime()));

2、Timer的cancel(),purge()

cancel()

作用:终止此计时器,丢弃所有当前已安排的任务。

    //休眠5秒
Thread.sleep(5000);
//取消当前所有任务
timer.calcel();

purge():

作用:从此计时器的任务队列中移除所有已取消的任务。

返回值:从队列中移除的任务数。

    timer.schedule(task2,1000,2000);
timer.purge(); Thread.sleep(2000);
Date cancelTimer = new Date();
task2.cancel();

五、schedule与schduleAtFixedRate的区别

1、区别:首次计划执行的时间早于当前的时间

schdule:

“fixed-delay”:如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行完成的时间点进行计算。

void main(String[] args){
//规定时间格式
final SimpleDateFormat sf = new SimpleDateFormat(yy:MM:dd mm:HH:ss)
//获取当前时间
Calendar calendar = Caledndar.getInstance();
out.print("sf.format(calendar.getTime()));
//设置成6秒前的时间,若当前时间为 00:00:06,
//那么设置之后时间变成00:00:00
calendar.add(Calendar.SECOND,-6);
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔2秒钟执行一次
timer.schedule(new TimerTask(){
public void run(){
//打印当前的计划执行时间
out.print("test:"+sf.format(scheduleExecutionTimer()));
}
},calendar.getTimer(),2000);
}

schduleAtFixedRate方法:

“fixed-rate”:如果第一次执行时间被delay了,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步

    timer.schduleAtFixedRate(new TimerTask(){
public void run(){
//打印当前的计划执行时间
out.print("test:"+sf.format(scheduleExecutionTimer()));
}
},calendar.getTimer(),2000);

2、区别:任务执行所需时间超过任务的执行周期间隔

schdule方法:

下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后

void main(String[] args){
//规定时间格式
final SimpleDateFormat sf = new SimpleDateFormat(yy:MM:dd mm:HH:ss)
//获取当前时间
Calendar calendar = Caledndar.getInstance();
out.print("sf.format(calendar.getTime()));
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔2秒钟执行一次
timer.schedule(new TimerTask(){
public void run(){
try{
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
//打印当前的计划执行时间
out.print("test:"+sf.format(scheduleExecutionTimer()));
}
},calendar.getTimer(),2000);
}

schduleAtFixedRate方法:

下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性

timer.schduleAtFixedRate(new TimerTask(){
public void run(){
try{
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
//打印当前的计划执行时间
out.print("test:"+sf.format(scheduleExecutionTimer()));
}
},calendar.getTimer(),2000);

六、Timer的缺陷

1、管理并发任务的缺陷

Timer有且仅有一个后台的线程,并不支持任务与任务之间的并发;如果存在多个任务,且任务时间过长,会导致执行效果与预期不符;

第二个任务会在第一个任务执行完成后在执行自己的任务;

2、当任务抛出异常时的缺陷

如果 TimerTask抛出RuntimeException,Timer会停止所有任务的运行;

    throw new RuntiomeException();  

第一个任务如果抛出异常,则第二个任务就不会再继续执行了,直接从第一个任务开始终止执行;

3、Timer的使用禁区:

对时效性要求较高的多任务并发作业:

对复杂任务的调度;

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

  1. java定时任务调度工具

    一.什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的时间执行次数自动执行的任务. 二.java中常用的定时任务调度工具: Timer Quartz 2.1两者区别: Timer源自jdk ...

  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. IDEA中配置Git,在Github上clone项目到IDEA

    一.安装git 1.用homebrew安装git 运行以下命令安装 brew install git 默认的安装位置是 /usr/local/Cellar目录中(后面会用到) 二.在idea中配置Gi ...

  2. TurtleBot3 Waffle (tx2版华夫)(2)系统安装

    Tx2系统默认是安装好的,由于镜像文件大于20G,无法上传百度网盘,所以如有需要请联系我们客服:下面主要是操作步骤: 2.1.准备工作 a.准备好利用Jetpack刷过机的Ubuntu的主机(HOST ...

  3. redis数据类型:String

    redis数据类型:String 花开堪折直需折,莫待无花空折枝 实际应用中有多种多样的场景,比如: 秒杀 新闻热点 在线人数 session.token管理 各个场景需要的数据类型各不相同:常见的数 ...

  4. Linux服务器初始化调优及安全加固

    一,开启iptables 仅开放必要的SSH端口和监控端口 示例:SSH tcp 22snmpd udp 161nrpe tcp 5666本人公网IP全端口开放 二,除非特别熟悉selinux配置,否 ...

  5. Databricks 第6篇:Spark SQL 维护数据库和表

    Spark SQL 表的命名方式是db_name.table_name,只有数据库名称和数据表名称.如果没有指定db_name而直接引用table_name,实际上是引用default 数据库下的表. ...

  6. 一些JavaSE学习过程中的思路整理(主观性强,持续更新中...)

    目录 一些JavaSE学习过程中的思路整理(主观性强,持续更新中...) Java书写规范 IDEA的一些常用快捷键 Java类中作为成员变量的类 Java源文件中只能有一个public类 Java中 ...

  7. 70.LeetCode爬楼梯

    爬楼梯 点击标题可跳转到官网进行查看 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: ...

  8. C++ 中的 inline 详解

    inline:是一个关键词,放在一个函数前面,说明这个函数是inline函数. inline函数是什么?inline有什么作用? 为了解答这个问题,我们首先要知道编译器是如何为我们工作的. 先看一段代 ...

  9. 【Linux】md5sum 生产所有文件的md5值,并对照目标文件是否相同

    现在加入有很多很多文件需要测试md5,想看下是否都传输成功了,如何批量生成文件的md5并且逐条对照呢? 下面来简单介绍下 md5sum这个命令有一个选项"-c" 这个选项的意思是c ...

  10. 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)

    题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...