目录

一、Java定时任务介绍

二、Timer

  1、Timer与TimerTask

  2、schedule

  3、scheduleAtFixRate

三、Quartz

一、Java定时任务介绍

  在Java中,用得比较多的有两种,一个是Timer,一个是Quartz;

  其中Timer是这是jdk自带的类库,一般用来实现简单的定时调度,由一个后台线程进行任务的调度,所以对于并发调度不友好;

  Quartz不是jdk自带的,但是他的功能更加强大,一般用于比较复杂的定时调度,可以解决Timer的并发调度问题;

二、Timer

2.1、Timer与TimerTask

  Timer是在jdk自带的工具类,Timer为与java.util包下,可以将其理解为一个“定时器”;

  当定时器到点后,执行的任务是TimerTask,称为“任务”;

  下面就是一个TimerTask示例,注意需要重写TimerTask的run方法,类似于Runnable接口的run方法。

  1. package cn.ganlixin.task;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.TimerTask;
  6.  
  7. public class MyTask extends TimerTask {
  8. @Override
  9. public void run() {
  10. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  11. System.out.println(dateFormat.format(new Date()));
  12. }
  13. }

    

  下面是一个简单的定时执行任务的示例:

  1. package cn.ganlixin.timer;
  2.  
  3. import cn.ganlixin.task.MyTask;
  4. import org.junit.Test;
  5.  
  6. import java.text.ParseException;
  7. import java.util.Timer;
  8.  
  9. public class TestTimer {
  10.  
  11. @Test
  12. public void testTimerDemo() throws InterruptedException {
  13. // 创建一个定时器
  14. Timer timer = new Timer();
  15.  
  16. // 5秒之后执行任务,只执行一次,执行MyTask的run方法
  17. // schedule(TimerTask task, long delay)
  18. timer.schedule(new MyTask(), 5 * 1000L);
  19.  
  20. // 让当前线程阻塞,等待上面的任务执行
  21. Thread.sleep(10000);
  22. }
  23. }

  Timer有几个可以设置任务执行的方法:

  1. // 在deley毫秒毫秒后,开始执行task,只执行一次
  2. void schedule(TimerTask task, long delay)
  3.  
  4. // 在deley毫秒毫秒后,开始执行task,之后每隔period毫秒执行一次task
  5. void schedule(TimerTask task, long delay, long period)
  6.  
  7. // 在date时刻,开始执行task,只执行一次
  8. void schedule(TimerTask task, Date date)
  9.  
  10. // 在date时刻,开始执行task,之后每隔period毫秒执行一次task
  11. void schedule(TimerTask task, Date firstTime, long period)
  12.  
  13. // 和schedule(TimerTask task, long delay, long period)一样,但是以固定速率执行
  14. scheduleAtFixedRate(TimerTask task, long delay, long period)
  15.  
  16. // 和schedule(TimerTask task, Date firstTime, long period)一样,但是以固定速率执行
  17. scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

  schedule和scheduleAtFixRate有一些区别。

2.2、schedule

  1、当首次计划执行时间早于当前时间,比如要求在1980年1月1日凌晨执行某个任务

  对于这种情况,启动定时任务后,会立即执行任务。下面是例子:

  1. package cn.ganlixin.timer;
  2.  
  3. import org.junit.Test;
  4.  
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import java.util.Timer;
  9. import java.util.TimerTask;
  10.  
  11. public class TestTimer {
  12.  
  13. @Test
  14. public void testStartBefore() throws InterruptedException, ParseException {
  15. Timer timer = new Timer();
  16. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  17. System.out.println("当前时间:" + dateFormat.format(new Date()));
  18.  
  19. Date date = dateFormat.parse("2019-01-01 01:00:00"); // 开始时间为过去
  20. timer.schedule(new TimerTask() {
  21. @Override
  22. public void run() {
  23. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  24.  
  25. Date scheduledExecuteTime = new Date(scheduledExecutionTime());
  26. System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime));
  27.  
  28. System.out.println("开始任务:" + dateFormat.format(new Date()));
  29. try {
  30. Thread.sleep(10000);
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. System.out.println("完成任务:" + dateFormat.format(new Date()));
  35. }
  36. }, date);
  37.  
  38. // 让当前线程阻塞,等待上面的任务执行
  39. Thread.sleep(100000);
  40. }
  41. }

  运行输出:

  1. 当前时间:2019-03-07 07:56:47
  2. 预计执行任务时间:2019-01-01 01:00:00
  3. 开始任务:2019-03-07 07:56:47
  4. 完成任务:2019-03-07 07:56:57

  

  2、首次执行时间在当前时间之后,但是执行时间超过了period(周期)

  比如,有一个任务在4秒后启动,每3秒执行1次,任务每次执行要10秒,此时,因为执行任务所需时间超过了周期时间,所以一次任务执行完后,立即执行下一次任务;

  1. package cn.ganlixin.timer;
  2.  
  3. import org.junit.Test;
  4.  
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import java.util.Timer;
  9. import java.util.TimerTask;
  10.  
  11. public class TestTimer {
  12.  
  13. @Test
  14. public void testTimerDemo() throws InterruptedException, ParseException {
  15. // 创建一个定时器
  16. Timer timer = new Timer();
  17. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  18. System.out.println("当前时间:" + dateFormat.format(new Date()));
  19.  
  20. timer.schedule(new TimerTask() {
  21. @Override
  22. public void run() {
  23. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  24.  
  25. Date scheduledExecuteTime = new Date(scheduledExecutionTime());
  26. System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime));
  27.  
  28. System.out.println("开始任务:" + dateFormat.format(new Date()));
  29. try {
  30. Thread.sleep(10000); // 休眠10秒,模拟任务执行耗时
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. System.out.println("完成任务:" + dateFormat.format(new Date()));
  35. System.out.println("-----------------------------------------");
  36. }
  37. }, 4 * 1000L, 3 * 1000L);
  38.  
  39. // 让当前线程阻塞,等待上面的任务执行
  40. Thread.sleep(100000);
  41. }
  42. }

  运行结果:

  1. 当前时间:2019-03-07 08:14:40
  2. 预计执行任务时间:2019-03-07 08:14:44
  3. 开始任务:2019-03-07 08:14:44
  4. 完成任务:2019-03-07 08:14:54
  5. -----------------------------------------
  6. 预计执行任务时间:2019-03-07 08:14:54
  7. 开始任务:2019-03-07 08:14:54
  8. 完成任务:2019-03-07 08:15:04
  9. -----------------------------------------
  10. 预计执行任务时间:2019-03-07 08:15:04
  11. 开始任务:2019-03-07 08:15:04
  12. 完成任务:2019-03-07 08:15:14
  13. -----------------------------------------
  14. 预计执行任务时间:2019-03-07 08:15:14
  15. 开始任务:2019-03-07 08:15:14
  16. .........

  

2.3、scheduleAtFixRate

  1、当首次计划执行时间早于当前时间,那么scheduleAtFixRate会将错过的这段时间中,本应该执行的任务“补”回来。

  1. package cn.ganlixin.timer;
  2.  
  3. import org.junit.Test;
  4.  
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import java.util.Timer;
  9. import java.util.TimerTask;
  10.  
  11. public class TestTimer {
  12.  
  13. @Test
  14. public void testTimerDemo() throws InterruptedException, ParseException {
  15. // 创建一个定时器
  16. Timer timer = new Timer();
  17. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  18. System.out.println("当前时间:" + dateFormat.format(new Date()));
  19.  
  20. Date date = dateFormat.parse("2019-01-01 01:00:00"); // 开始时间为过去
  21. timer.scheduleAtFixedRate(new TimerTask() {
  22. @Override
  23. public void run() {
  24. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  25.  
  26. Date scheduledExecuteTime = new Date(scheduledExecutionTime());
  27. System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime));
  28.  
  29. System.out.println("开始任务:" + dateFormat.format(new Date()));
  30. try {
  31. Thread.sleep(10000); // 休眠10秒,模拟任务执行耗时
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. System.out.println("完成任务:" + dateFormat.format(new Date()));
  36. System.out.println("-----------------------------------------");
  37. }
  38. }, date, 3 * 1000L);
  39.  
  40. // 让当前线程阻塞,等待上面的任务执行
  41. Thread.sleep(100000);
  42. }
  43. }

  

  2、首次执行时间在当前时间之后,但是执行时间超过了period(周期),此时会将错过的任务补回来

  1. package cn.ganlixin.timer;
  2.  
  3. import org.junit.Test;
  4.  
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import java.util.Timer;
  9. import java.util.TimerTask;
  10.  
  11. public class TestTimer {
  12.  
  13. @Test
  14. public void testTimerDemo() throws InterruptedException, ParseException {
  15. // 创建一个定时器
  16. Timer timer = new Timer();
  17. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  18. System.out.println("当前时间:" + dateFormat.format(new Date()));
  19.  
  20. timer.scheduleAtFixedRate(new TimerTask() {
  21. @Override
  22. public void run() {
  23. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  24.  
  25. Date scheduledExecuteTime = new Date(scheduledExecutionTime());
  26. System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime));
  27.  
  28. System.out.println("开始任务:" + dateFormat.format(new Date()));
  29. try {
  30. Thread.sleep(10000); // 休眠10秒,模拟任务执行耗时
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. System.out.println("完成任务:" + dateFormat.format(new Date()));
  35. System.out.println("-----------------------------------------");
  36. }
  37. }, 4 * 1000L, 3 * 1000L);
  38.  
  39. // 让当前线程阻塞,等待上面的任务执行
  40. Thread.sleep(100000);
  41. }
  42. }

  运行输出

  1. 当前时间:2019-03-07 08:26:53
  2. 预计执行任务时间:2019-03-07 08:26:57
  3. 开始任务:2019-03-07 08:26:57
  4. 完成任务:2019-03-07 08:27:07
  5. -----------------------------------------
  6. 预计执行任务时间:2019-03-07 08:27:00
  7. 开始任务:2019-03-07 08:27:07
  8. 完成任务:2019-03-07 08:27:17
  9. -----------------------------------------
  10. 预计执行任务时间:2019-03-07 08:27:03
  11. 开始任务:2019-03-07 08:27:17
  12. 完成任务:2019-03-07 08:27:27
  13. -----------------------------------------
  14. 预计执行任务时间:2019-03-07 08:27:06
  15. 开始任务:2019-03-07 08:27:27
  16. 完成任务:2019-03-07 08:27:37

  

三、Quartz

安装Java和Tomcat的更多相关文章

  1. Linux学习3-yum安装java和Tomcat环境

    前言 linux上安装软件,可以用yum非常方便,不需要下载解压,一个指令就能用yum安装java和tomcat环境. 前面一篇已经实现在阿里云服务器上搭建一个禅道系统的网站,算是小有成就,但并不是每 ...

  2. CentOS 7 服务器配置--安装Java和Tomcat

    一 安装 JAVA (jdk_8u121_linux_x64) #查看是否安装了OpenJDK #检查是否安装了JAVA java -version rpm -qa | grep java #卸载已安 ...

  3. 在centos 6.3系统下安装java、tomcat环境的方法与步骤(方法经过验证,可安装成功)

    一.安装java1. 下载java二进制安装包 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http ...

  4. Linux学习2-云服务器上安装java和tomcat环境

    在linux上部署java的项目,首先要安装JDK和Tomcat,具体要求怎么操作呢,我们一起来学习吧! JDK的安装步骤如下: 1.首先我们从官网下载jdk-8u231-linux-x64.rpm安 ...

  5. redhat7.6 安装java和tomcat

    使用yum 安装java # 首先查看是否安装yum rpm -qa | grep yum yum-3.4.3-161.el7.noarch # 显示这个表示已经安装了. # 查看是否安装java,没 ...

  6. linux安装java mysql tomcat 环境

    安装jdk: 1. 查看系统版本 uname -a 2.查看操作系统 cat  /proc/version 3.上传安装文件到指定目录   tar -zxvf jdkxxx. 4.修改配置文件  vi ...

  7. 检查linux是否安装java、tomcat、mysql

    linux下,查看安装软件 1.linux下的java Java -version 如果出现java版本,证明java安装成功. 2.linux下的tomcat 2.1.检查linux是否安装tomc ...

  8. java、tomcat安装

    今天记录下如何安装java和tomcat,毕竟作为开发人员换电脑或重装系统后都是要装好这些环境的. java的安装: 1.下载sdk,官网地址:https://www.oracle.com/techn ...

  9. JAVA和Tomcat运维整理

    安装JAVA和Tomcatapache-tomcat-8.5.37.tar.gz  jdk-8u191-linux-x64.rpm [root@localhost ~]# ll /usr/java/t ...

随机推荐

  1. static 静态与非静态的区别

    静态属性是共享一块内存空间.实例的是各自独享一块内存空间. 比如同一个name属性.如果是实例成员.那么你每创建了一个对象.赋给name值.假如创建了2个对象.第一个赋值张三.第2个赋值李四.它们就分 ...

  2. ARM与FPGA通过spi通信设计1.spi基础知识

    SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息.SPI总线可直接与各个厂家生产 ...

  3. Dynamics 365出现数据加密错误怎么办?

    本人微信公众号:微软动态CRM专家罗勇 ,回复290或者20181227可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dy ...

  4. Xamarin 学习笔记 - Page(页面)

    本文翻译自CodeProject文章:https://www.codeproject.com/Articles/1226447/Xamarin-Notes-Xamarin-Forms-Pages 转载 ...

  5. 命令行以及Python交互模式下python程序的编写

    一.命令行模式 在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:\>: 二.Python交互模式 在命令行模式下敲命令python,就看到类似如下的一堆文本输出 ...

  6. Dynamics AX 2012 R2 电子邮件广播错误 0x80040213

    Dynamics AX 2012 R2 电子邮件广播错误 0x80040213 今天Reinhard在新环境做邮件广播测试时,发现无法发送邮件,并报以下错误: 类"CDO.Message&q ...

  7. 案例解析|政府信息化的BI建设应用 .

    一.行业背景 某建设厅综合监管信息化平台,是政企业务协同的平台之一,同时兼具协作.门户.办公应用集成.用户权限管理等多项功能.在此要求基础上,选择中间件基础技术平台,可以在最大程度满足平台功能需求的前 ...

  8. ionic3 Modal组件

     Modal组件主要用来弹出一些临时的框,如登录,注册的时候用 弹出页面html页面 <button ion-button small outline color="he" ...

  9. [aspnetcore.apidoc]一款很不错的api文档生成工具

    AspNetCore.ApiDoc 简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger 最初我们也有在试用swagger,但总是有些感觉,感觉有点不满意,就但从api ...

  10. TomCat的安装及测试

    1.每个版本的安装都是一样,解压之后是一个文件夹 2.配置环境变量,右击我的电脑,属性--高级属性设置--环境变量--新建--配path即可(path后加;%CATALINA_HOME%\bin;) ...