博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java定时任务调度工具
阅读量:4677 次
发布时间:2019-06-09

本文共 2583 字,大约阅读时间需要 8 分钟。

一、什么是定时任务调度

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

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

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

转载于:https://www.cnblogs.com/yxth/p/8638582.html

你可能感兴趣的文章
微软官方中文新书《Windows Phone 7应用开发指南 》出版
查看>>
Python实现无向图最短路径
查看>>
《结网》—— 读后总结
查看>>
CSS复合选择器
查看>>
米勒罗宾素性测试(Miller–Rabin primality test)
查看>>
正则表达式介绍
查看>>
删除排序数组中的重复数字 II
查看>>
初始面向对象
查看>>
Linux下查看进程和端口信息
查看>>
windows 的文件夹映射实现
查看>>
初始函数与函数的参数
查看>>
Java PDF转换成图片并输出给前台展示
查看>>
(转载)Linux一句话精彩-5
查看>>
C++取止运算符重载
查看>>
此生对我影响最大的三位老师
查看>>
基于C#的Lync Server管理
查看>>
python+selenium如何定位页面的元素,有几种定位元素的方法?
查看>>
Exception occurred during processing request: id to load is required for loading
查看>>
go语言,chanel and goroutine(golang)(三)
查看>>
正则匹配、替换
查看>>