目录

一、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方法。

package cn.ganlixin.task;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask; public class MyTask extends TimerTask {
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(new Date()));
}
}

    

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

package cn.ganlixin.timer;

import cn.ganlixin.task.MyTask;
import org.junit.Test; import java.text.ParseException;
import java.util.Timer; public class TestTimer { @Test
public void testTimerDemo() throws InterruptedException {
// 创建一个定时器
Timer timer = new Timer(); // 5秒之后执行任务,只执行一次,执行MyTask的run方法
// schedule(TimerTask task, long delay)
timer.schedule(new MyTask(), 5 * 1000L); // 让当前线程阻塞,等待上面的任务执行
Thread.sleep(10000);
}
}

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

// 在deley毫秒毫秒后,开始执行task,只执行一次
void schedule(TimerTask task, long delay) // 在deley毫秒毫秒后,开始执行task,之后每隔period毫秒执行一次task
void schedule(TimerTask task, long delay, long period) // 在date时刻,开始执行task,只执行一次
void schedule(TimerTask task, Date date) // 在date时刻,开始执行task,之后每隔period毫秒执行一次task
void schedule(TimerTask task, Date firstTime, long period) // 和schedule(TimerTask task, long delay, long period)一样,但是以固定速率执行
scheduleAtFixedRate(TimerTask task, long delay, long period) // 和schedule(TimerTask task, Date firstTime, long period)一样,但是以固定速率执行
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

  schedule和scheduleAtFixRate有一些区别。

2.2、schedule

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

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

package cn.ganlixin.timer;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class TestTimer { @Test
public void testStartBefore() throws InterruptedException, ParseException {
Timer timer = new Timer();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间:" + dateFormat.format(new Date())); Date date = dateFormat.parse("2019-01-01 01:00:00"); // 开始时间为过去
timer.schedule(new TimerTask() {
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date scheduledExecuteTime = new Date(scheduledExecutionTime());
System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime)); System.out.println("开始任务:" + dateFormat.format(new Date()));
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成任务:" + dateFormat.format(new Date()));
}
}, date); // 让当前线程阻塞,等待上面的任务执行
Thread.sleep(100000);
}
}

  运行输出:

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

  

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

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

package cn.ganlixin.timer;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class TestTimer { @Test
public void testTimerDemo() throws InterruptedException, ParseException {
// 创建一个定时器
Timer timer = new Timer();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间:" + dateFormat.format(new Date())); timer.schedule(new TimerTask() {
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date scheduledExecuteTime = new Date(scheduledExecutionTime());
System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime)); System.out.println("开始任务:" + dateFormat.format(new Date()));
try {
Thread.sleep(10000); // 休眠10秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成任务:" + dateFormat.format(new Date()));
System.out.println("-----------------------------------------");
}
}, 4 * 1000L, 3 * 1000L); // 让当前线程阻塞,等待上面的任务执行
Thread.sleep(100000);
}
}

  运行结果:

当前时间:2019-03-07 08:14:40
预计执行任务时间:2019-03-07 08:14:44
开始任务:2019-03-07 08:14:44
完成任务:2019-03-07 08:14:54
-----------------------------------------
预计执行任务时间:2019-03-07 08:14:54
开始任务:2019-03-07 08:14:54
完成任务:2019-03-07 08:15:04
-----------------------------------------
预计执行任务时间:2019-03-07 08:15:04
开始任务:2019-03-07 08:15:04
完成任务:2019-03-07 08:15:14
-----------------------------------------
预计执行任务时间:2019-03-07 08:15:14
开始任务:2019-03-07 08:15:14
.........

  

2.3、scheduleAtFixRate

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

package cn.ganlixin.timer;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class TestTimer { @Test
public void testTimerDemo() throws InterruptedException, ParseException {
// 创建一个定时器
Timer timer = new Timer();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间:" + dateFormat.format(new Date())); Date date = dateFormat.parse("2019-01-01 01:00:00"); // 开始时间为过去
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date scheduledExecuteTime = new Date(scheduledExecutionTime());
System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime)); System.out.println("开始任务:" + dateFormat.format(new Date()));
try {
Thread.sleep(10000); // 休眠10秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成任务:" + dateFormat.format(new Date()));
System.out.println("-----------------------------------------");
}
}, date, 3 * 1000L); // 让当前线程阻塞,等待上面的任务执行
Thread.sleep(100000);
}
}

  

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

package cn.ganlixin.timer;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class TestTimer { @Test
public void testTimerDemo() throws InterruptedException, ParseException {
// 创建一个定时器
Timer timer = new Timer();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间:" + dateFormat.format(new Date())); timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date scheduledExecuteTime = new Date(scheduledExecutionTime());
System.out.println("预计执行任务时间:" + dateFormat.format(scheduledExecuteTime)); System.out.println("开始任务:" + dateFormat.format(new Date()));
try {
Thread.sleep(10000); // 休眠10秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成任务:" + dateFormat.format(new Date()));
System.out.println("-----------------------------------------");
}
}, 4 * 1000L, 3 * 1000L); // 让当前线程阻塞,等待上面的任务执行
Thread.sleep(100000);
}
}

  运行输出

当前时间:2019-03-07 08:26:53
预计执行任务时间:2019-03-07 08:26:57
开始任务:2019-03-07 08:26:57
完成任务:2019-03-07 08:27:07
-----------------------------------------
预计执行任务时间:2019-03-07 08:27:00
开始任务:2019-03-07 08:27:07
完成任务:2019-03-07 08:27:17
-----------------------------------------
预计执行任务时间:2019-03-07 08:27:03
开始任务:2019-03-07 08:27:17
完成任务:2019-03-07 08:27:27
-----------------------------------------
预计执行任务时间:2019-03-07 08:27:06
开始任务:2019-03-07 08:27:27
完成任务: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. NLP入门(七)中文预处理之繁简体转换及获取拼音

      在日常的中文NLP中,经常会涉及到中文的繁简体转换以及拼音的标注等问题,本文将介绍这两个方面的实现.   首先是中文的繁简体转换,不需要使用额外的Python模块,至需要以下两个Python代码文 ...

  2. MySQL 笔记整理(9) --普通索引和唯一索引,应该怎么选择?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 9) --普通索引和唯一索引,应该怎么选择? 假如你在维护一个市民系统, ...

  3. c#计算机视觉库openCVSharp

    作为研究计算机视觉的一员,大家肯定对Intel大名鼎鼎的openCV系列计算机视觉库耳熟能详,对于很多人来说openCV甚至已经成为其项目研究不可缺少的一部分.但是,由于项目兼容性的要求.openCV ...

  4. Java基础:一个100%会发生死锁的程序

        多线程是Java工程师进阶所必须掌握的一项技能,也是面试中绕不过的一个环节,而死锁又是多线程同步失败的经典案例,对于复杂的系统,死锁是很难通过代码层面来做静态检测和排查的,所以有的面试官会从反 ...

  5. 为什么选择 Intellij IDEA 作为日常开发工具

    作为一个从事 Java 开发的程序员,每天离不开编辑器的帮助.还记得刚开始学习 Java 编程的时候,使用 Eclipse 作为日常开发工具.后来工作以后,需要使用 Intellij IDEA,刚开始 ...

  6. 从零学习Fluter(二):win10上环境搭建以及模拟器和真机调试

    今天呢,又继续看了flutter 弗拉特 的东西,绝的这个东西绝对是比ReactNative更高一层次的,在2018年12月5好,flutter的第一个stale1.0发布了,我们在GitHub上可以 ...

  7. 转一篇OpenSSL的例子:简单的TLS服务器

    原名:Simple TLS Server 原址:https://wiki.openssl.org/index.php/Simple_TLS_Server Windows下就不要从源码编译OpenSSL ...

  8. bootstrap-treeview 在 bootstrap 4 不兼容解决办法及使用

    bootstrap-treeview 是bootstrap的一个树形插件,插件依赖: bootstrap/3.3.7 jquery/3.3.1 经过验证,它不可以在 bootstrap 高于 3.3. ...

  9. mysql解决select * from 表名 (where + 约束条件为空)

    mysql解决select * from 表名 (where + 约束条件为空),示例如下: SELECT * from tableName WHERE name is NULL; 从 tableNa ...

  10. oracle EM 如何调整界面显示的语言

    EM是通过浏览器语言来识别界面语言的,没有选项调整.我以chrome为例将默认中文改为英文: EM调整前为中文界面: 调整chrome语言显示为英文: 再重新开一个窗口,打开EM,界面已经调整为英文了 ...