Java 中 Timers 类

1 概览

JDK 库中 Timer 类主要是负责计划任务的功能,也就是说在指定的时间开始执行某一任务。虽然说 Timer 类的主要作用是设置计划任务,但封装任务的类却是 TimerTask 类方法列表如图:
Java 中 Timers 类_第1张图片

2 实例

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Run1 {
    //创建 Timer 实例。 如果参数为 true ,则将创建守护线程
    private static Timer t=new Timer();
    //继承 TimerTask 类,TimerTask 类实现了 Runnable 接口
    static public class MyTask extends TimerTask{
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("运行了,时间为"+new Date());
        }}

    public static void main(String[] args){
        try {
            MyTask mt=new MyTask();
            SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
            String s="2017-05-23 20-06-20";
            //指定运行的时间
            Date date=sd.parse(s);
            System.out.println("字符串消息"+date.toLocaleString()+"--"+"当前时间"+new Date().toLocaleString());
            //schedule() 方法安排在指定的时间执行指定的的任务
            t.schedule(mt, date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

任务执行完后惊奇的发现进程并没有销毁,这里写图片描述呈红色状态,其实这个很好理解,来看下 Timer 构造方法的源码:

public Timer(){
   this("Timer-"+serialNumber());
}

public Timer(String name) {
        thread.setName(name);
        thread.start();
 }

查看构造方法可以知道创建一个 Timer 就是启动了一个新的线程,这个线程只要没有销毁就会一直在运行。也可以将新创建的 Timer 改成守护线程。只需要就上面的代码改为:

private static Timer t=new Timer(true);

如果这样改的话,程序运行完将结束当前线程,并且 TimerTask 中的任务不再被执行 。

3 方法简介

相信通过了上面的的实例已经对 Timer 类有了大概的了解了,接下来在对每个方法的不同情况进行分析:

3.1 schedule(TimerTask task, Date time)

安排在指定的时间执行指定的任务。
①当执行任务的时间晚于当前时间,任务会在指定的时间执行。
②当执行任务的时间早于当前时间,任务会立即执行。
③当多个 TimerTask 任务及延时的时候,任务会以队列的方式一个一个执行,但执行的时间可能回合预期有所不同,因为前面的任务有可能消耗的时间过长,后面任务执行的时间也会被延迟。

3.2 schedule(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定延迟执行。
该方法和 schedule(TimerTask task, Date time) 方法情况类似,唯一不同的是该方法会以间隔为 period 的时间循环执行任务。

3.3 schedule(TimerTask task, long delay)

安排在指定延迟后执行指定的任务。
该方法作用是以执行 schedule(TimerTask task, long delay) 方法的当前时间为准,在此时间基础上延迟指定的毫秒数执行一次任务。(delay 为指定的毫秒数)。

3.4 schedule(TimerTask task, long delay, long period)

安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
该方法是在 schedule(TimerTask task, long delay, long period) 方法执行的时间前提下,延迟指定的毫秒数,再以某一间隔时间无限次执行任务。(delay 为指定延迟毫秒,period 为指定间隔毫秒)。

3.5 scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定速率执行。

3.6 scheduleAtFixedRate(TimerTask task, long delay, long period)

安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

3.7 cancel()

终止此计时器,丢弃所有当前已安排的任务。
该方法分为两种情况:
①TimerTask 类的 cancel() 方法:将自身从任务队列中清除出去。
②Timer类的 cancel() 方法:将任务队列中所有的任务清空。

3.8 purge()

从此计时器的任务队列中移除所有已取消的任务。

注意:scheduleAtFixedRate()方法具有追赶性,schedule() 方法不具有追赶性。追赶性就是当执行任务的时间早于当前时间,两个时间段内的任务被“补充性”执行了。

你可能感兴趣的:(java,java)