Java定时任务之Timer(慕课网笔记)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshuo1231/article/details/77149682

定时任务就是基于给定的时间点,时间间隔或者给定的执行次数自动的执行任务。
Timer API定义:
有且仅有一个后台线程,对多个任务线程进行定时定频率的调用。
主要涉及两个类:java.util.Timer和java.util.TimerTask类、
简单的实例:在当前时间的2秒钟后开始执行,然后每隔4秒钟执行一次打印任务
MyTimerTask.java

import java.util.TimerTask;

/**
 * <p>类说明:</p>
 * @author 作者:孙硕
 * @version 时间:2017年8月13日 下午7:43:44
 */
public class MyTimerTask extends TimerTask {
    private String name;

    public MyTimerTask(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        //打印当前名字的内容
        System.out.println("Current exec name is : " + name);
    }

    //setter和getter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

MyTimer.java

import java.util.Timer;

/**
 * <p>类说明:</p>
 * @author 作者:孙硕
 * @version 时间:2017年8月13日 下午7:49:44
 */
public class MyTimer {

    public static void main(String[] args) {
        //1.创建TImer实例
        Timer timer = new Timer();
        //2.创建TimerTask实例
        MyTimerTask myTimerTask = new MyTimerTask("No.1");
        //3.通过timer定频率的调用timertask业务逻辑
        //在当前时间的2秒钟后开始执行,然后每隔4秒钟执行一次
        timer.schedule(myTimerTask, 2000L, 4000L);
    }

}

最后执行的结果按要求执行。

schedule的4种用法:

1. public void schedule(TimerTask task, Date time)
task:待执行的任务 time:执行的时间
当时间等于或者大于time的时候执行且只执行一次task
2.public void schedule(TimerTask task, Date firstTime, long period)
task:待执行的任务 time:执行的时间
当时间等于或者大于time的时候首先执行一次task,然后每隔period毫秒再执行一次task。
3. public void schedule(TimerTask task, long delay)
在当前时间延迟delay毫秒后执行且只执行一次任务
4. public void schedule(TimerTask task, long delay, long period)
当前时间延迟delay毫秒后执行一次任务,然后每隔period毫秒再执行一次task
附上代码:
MyTimerTask2.java

package com.sunshuo.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;

/**
 * <p>类说明:schedule(TimerTask task,  Date time)</p>
 * @author 作者:孙硕
 * @version 时间:2017年8月13日 下午7:43:44
 */
public class MyTimerTask2 extends TimerTask {
    private String name;

    public MyTimerTask2(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        //以yyyy-MM-dd HH:mm:ss格式打印时间
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(
            "Current exec time is : " + sdf.format(calendar.getTime()));
        //打印当前名字的内容
        System.out.println("Current exec name is : " + name);
    }

    //setter和getter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

MyTimer2.java

package com.sunshuo.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;

/**
 * <p>类说明:</p>
 * @author 作者:孙硕
 * @version 时间:2017年8月13日 下午7:49:44
 */
public class MyTimer2 {

    public static void main(String[] args) {
        //1.创建TImer实例
        Timer timer = new Timer();
        //2.创建TimerTask实例
        MyTimerTask2 myTimerTask = new MyTimerTask2("No.2");
        /*
         * 获取当前时间,并设置3秒钟后的时间
         */
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("MyTimer2 : Current exec time is : "
                + sdf.format(calendar.getTime()));
        calendar.add(Calendar.SECOND, 3);//设置当前时间加3秒钟
        //--------  schedule的用法 ----------
        /*
         * 1. public void schedule(TimerTask task, Date time)
         * 在时间等于或者大于time的时间执行且只执行一次
         */
        myTimerTask.setName("schedule(task, time)的用法");
        timer.schedule(myTimerTask, calendar.getTime());
        /*
         * 2. public void schedule(TimerTask task, Date firstTime, long period)
         * 在时间等于或者大于time的时间首先执行一次,然后每隔period毫秒再执行一次task
         */
        myTimerTask.setName(
            "schedule(TimerTask task, Date firstTime, long period)的用法");
        timer.schedule(myTimerTask, calendar.getTime(), 4000L);
        /*
         * 3. public void schedule(TimerTask task, long delay)
         * 在当前时间延迟delay毫秒后执行且只执行一次任务
         */
        myTimerTask
                .setName("public void schedule(TimerTask task, long delay)的用法");
        timer.schedule(myTimerTask, 1000L);
        /*
         * 4. public void schedule(TimerTask task, long delay, long period)
         * 当前时间延迟delay毫秒后执行一次任务,然后每隔period毫秒再执行一次task
         */
        myTimerTask.setName(
            "public void schedule(TimerTask task, long delay, long period)的用法");
        timer.schedule(myTimerTask, 1000L, 3000L);
    }

}

scheduledExecutionTime和schedule区别:
1. 首次计划执行的时间遭遇当前的时间
2.任务执行所需的时间超出执行周期间隔

(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间按 照 上一次 实际执行完成的时间点 进行计算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步

(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
(2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性

TimerTask里其他函数:
cancel():取消当前TImerTask里的任务
public long scheduledExecutionTime()
返回最近实际执行此任务的时间

Timer其他函数:
cancel():终止此计时器,丢弃当前已经安排的所有任务
purge:将已经取消的任务从队列中移除,返回移除的数量

猜你喜欢

转载自blog.csdn.net/sunshuo1231/article/details/77149682