安装Java和Tomcat
目录
二、Timer
2、schedule
三、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的更多相关文章
- Linux学习3-yum安装java和Tomcat环境
前言 linux上安装软件,可以用yum非常方便,不需要下载解压,一个指令就能用yum安装java和tomcat环境. 前面一篇已经实现在阿里云服务器上搭建一个禅道系统的网站,算是小有成就,但并不是每 ...
- CentOS 7 服务器配置--安装Java和Tomcat
一 安装 JAVA (jdk_8u121_linux_x64) #查看是否安装了OpenJDK #检查是否安装了JAVA java -version rpm -qa | grep java #卸载已安 ...
- 在centos 6.3系统下安装java、tomcat环境的方法与步骤(方法经过验证,可安装成功)
一.安装java1. 下载java二进制安装包 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http ...
- Linux学习2-云服务器上安装java和tomcat环境
在linux上部署java的项目,首先要安装JDK和Tomcat,具体要求怎么操作呢,我们一起来学习吧! JDK的安装步骤如下: 1.首先我们从官网下载jdk-8u231-linux-x64.rpm安 ...
- redhat7.6 安装java和tomcat
使用yum 安装java # 首先查看是否安装yum rpm -qa | grep yum yum-3.4.3-161.el7.noarch # 显示这个表示已经安装了. # 查看是否安装java,没 ...
- linux安装java mysql tomcat 环境
安装jdk: 1. 查看系统版本 uname -a 2.查看操作系统 cat /proc/version 3.上传安装文件到指定目录 tar -zxvf jdkxxx. 4.修改配置文件 vi ...
- 检查linux是否安装java、tomcat、mysql
linux下,查看安装软件 1.linux下的java Java -version 如果出现java版本,证明java安装成功. 2.linux下的tomcat 2.1.检查linux是否安装tomc ...
- java、tomcat安装
今天记录下如何安装java和tomcat,毕竟作为开发人员换电脑或重装系统后都是要装好这些环境的. java的安装: 1.下载sdk,官网地址:https://www.oracle.com/techn ...
- JAVA和Tomcat运维整理
安装JAVA和Tomcatapache-tomcat-8.5.37.tar.gz jdk-8u191-linux-x64.rpm [root@localhost ~]# ll /usr/java/t ...
随机推荐
- 使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)
前言:大过年的,写篇文章不容易,还是给自己点个赞~~年前找了下.net安装包的制作方法,发现Visual Studio自带的制作工具使用起来非常麻烦,需要单独下载安装包,并且什么激活认证等等屁事相当麻 ...
- [angularjs] AngularJs 知识回顾
AngularJs 知识回顾 简介 1.通过指令扩展了 HTML,通过表达式绑定数据到 HTML: 2.一个 Js 框架: 3.指令: 通过被称为 指令 的新属性来扩展 HTML, 即为应用添加新功能 ...
- Java 学习笔记 网络编程 使用Socket传输文件 CS模式
Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...
- 【Java】List遍历时删除元素的正确方式
当要删除ArrayList里面的某个元素,一不注意就容易出bug.今天就给大家说一下在ArrayList循环遍历并删除元素的问题.首先请看下面的例子: import java.util.ArrayLi ...
- 使用Jenkins自动发布Windows服务项目
不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题: 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务. 如何上传编译文件到目标服务器? 问题1:如何远程停止和 ...
- 微信小程序异步请求问题
微信小程序为了提高用户体验,提供的api大部分都是异步操作,除了数据缓存操作里面有一些同步操作.是提高了用户体验,但是在开发的时候, 就有点坑了,例如我要写一个公共方法,发起网络请求,去后台去一些数据 ...
- openlayers3 实现点选的几种方式
WebGIS开发中,点击查询是最常用的一种查询方式,在ArcGIS api 中,这种查询叫IdentifyTask,主要作用是前台提交参数,交ArcServer查询分析返回.本文从开源框架的角度,从前 ...
- linux命令df中df -h和df -i
df 命令: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [ ...
- 如何开启红米手机4X的ROOT超级权限
红米手机4X通过什么方法拥有了root权限?大家都清楚,Android机器有root权限,如果手机拥有了root相关权限,可以实现更强的功能,举个栗子大家公司的营销部门同事,使用大多数营销软件都需要在 ...
- 手机Soc芯片简介
手机SoC(System On a Chip,在一个芯片里面集成CPU.GPU.SP.ISP.RAM内存.Wi-Fi控制器.基带芯片以及音频芯片等)芯片(基于arm架构指令集) 高通骁龙(Snapdr ...