Java定时任务调度工具-Timer

来源:互联网 发布:java api1.6文档下载 编辑:程序博客网 时间:2024/06/06 07:48

定时任务的几种实现,从技术上来分类,目前主要有三种技术(或者说有三种产品):

1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少

2.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂

3.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多

Timer简介

一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

Timer的基本使用

public class MyTimerTask extends TimerTask {    private String name;    public MyTimerTask(String inputName){        name=inputName;    }    @Override    public void run() {        System.out.println("Current exec name is:"+name);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
public class MyTimer {    public static void main(String[] args) {        Timer timer=new Timer();        MyTimerTask myTimerTask=new MyTimerTask("No.1");        //通过timer定时定频率的调用myTimerTask的业务逻辑:        //即第一次执行是在当前时间的2s之后,之后每隔1s执行一次        timer.schedule(myTimerTask,2000L,1000L);    }}

使用 Timer 实现任务调度的核心类是 Timer 和 TimerTask。其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可

Timer定时函数的用法:

Timer提供了schedule方法,该方法有多中重载方式来适应不同的情况,如下:

1.schedule(TimerTask task, Date time):在等于或超过time时间后执行且执行一次task2.schedule(TimerTask task, Date firstTime, long period) :安排指定的任务在指定的时间开始进行重复的固定延迟执行3.schedule(TimerTask task, long delay) :安排在指定延迟后执行指定的任务4.schedule(TimerTask task, long delay, long period) :安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

同时也重载了scheduleAtFixedRate方法,scheduleAtFixedRate方法与schedule相同,只不过他们的侧重点不同:

1.scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任务在指定的时间开始进行重复的固定速率执行2.scheduleAtFixedRate(TimerTask task, long delay, long period):安排指定的任务在指定的延迟后开始进行重复的固定速率执行

其他的重要函数之Timer:

1.cancel():终止此计时器,丢弃所有当前已经安排的任务2.purge():从此计时器的任务队列中移除所有已经取消的任务,返回值是移除的任务数

其他的重要函数之TimerTask:

1.boolean cancel():取消此计时器任务2.long scheduledExecutionTime():返回此任务最近实际执行的安排执行时间

分析schedule和scheduleAtFixedRate的不同:这个网上很多,自己谷歌了!!!

Timer的缺陷

Timer管理时间延迟缺陷(即管理并发任务的缺陷):

前面Timer在执行定时任务时只会创建一个线程任务,如果存在多个线程,若其中某个线程因为某种原因而导致线程任务执行时间过长,超过了两个任务的间隔时间,会发生一些缺陷

Timer抛出异常缺陷:

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

对于Timer的缺陷,我们可以考虑 ScheduledThreadPoolExecutor 来替代。Timer是基于绝对时间的,对系统时间比较敏感,而ScheduledThreadPoolExecutor 则是基于相对时间;Timer是内部是单一线程,而ScheduledThreadPoolExecutor内部是个线程池,所以可以支持多个任务并发执行