定时任务调度工具之Timer(二)

Timer的定时调度函数

一、schedule的四种用法

1.schedule(task,time)

参数
    task:所要安排的任务
    time:执行任务的时间
作用
    在时间等于或者超过time的时候执行且仅执行一次task

等于或者超过time:
如果time是晚于现在的时间,那么当schedule上之后(执行schedule方法),time的后台线程就会一直等待着;
当现在的时间等于time的时候:
就会去执行task里面的内容;对于超过的情况,比如time是早于现在的时间,一旦schedule上,后台线程就会立即执行task的内容

s1.jpg

2.schedule(task, time, period)

参数
    task:所要安排的任务
    time:首次执行任务的时间
    period:执行一次task的时间间隔,单位是毫秒
作用
    时间等于或者超过time时首次执行task
    之后每隔period毫秒重复执行一次task

s2.jpg

3.schedule(task, delay)

参数
    task:所要安排的任务
    delay:执行任务前的延迟时间,单位是毫秒
作用
    等待delay毫秒后仅执行且执行一个task

s3.jpg

4.schedule(task, delay, period)

参数
    task:所要安排的任务
    delay:执行任务前的延迟时间,单位是毫秒
    period:执行一次task的时间间隔,单位是毫秒
作用
    等到delay毫秒后首次执行task
    之后每隔period毫秒重复执行一次task

s4.jpg

代码演示:

定时调度的业务逻辑类:

    package com.hcx.timer;

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

    /**
     * Created by HCX on 2017/8/28.
     * 需要定时调度的业务逻辑类
     */
    public class MyTimerTask extends TimerTask{

        private String name;

        public MyTimerTask(String inputName) {
            name = inputName;
        }

        @Override
        public void run() {
            /*
             * 以yyyy-MM-dd HH:mm:ss的格式打印当前执行时间
             * 如:2017-8-29 00:00:00
             */
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("Current exec time is(task) : " + sf.format(calendar.getTime()));
            // 打印当前 name 的内容
            System.out.println("Current exec name is(task) : " + name);
        }

        public String getName() {
            return name;
        }

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

定时调度类:

package com.hcx.timer;

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

/**
 * Created by HCX on 2017/8/28.
 * 定时调度类
 */
public class MyTimer {

    public static void main(String[] args){

        //创建一个Timer实例(位于java.util包下的)
        Timer timer = new Timer();
        //创建一个MyTimerTask实例
        MyTimerTask myTimerTask = new MyTimerTask("hcx");
        /*
         * 通过Timer定时定频率调用MyTimerTask的业务逻辑
         * 即第一次执行是在当前时间的两秒钟之后,之后每隔一秒钟执行一次
         */
        //timer.schedule(myTimerTask,2000L,1000L);
        /**
         * 获取当前时间,并设置成距离当前时间三秒之后的时间
         * 如当前时间是2017-08-29 23:59:57
         * 则设置后的时间则为2017-8-30 00:00:00
         */
        Calendar calendar = Calendar.getInstance();
        // 定义日期格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current exec time is : " + simpleDateFormat.format(calendar.getTime()));
        //设置距离当前时间3秒之后的时间
        calendar.add(Calendar.SECOND,3);

        // schedule的四种用法

        /**
         * 1.在时间等于或超过time的时候执行仅且执行一次task
         *   如在2017-08-30 00:00:00执行一次task,打印任务名字
         */
        //myTimerTask.setName("schedule1");
        //通过timer去schedule TimerTask,达成调度的功能
        //timer.schedule(myTimerTask,calendar.getTime());

        //执行结果:
        /*
        Current exec time is : 2017-08-29 15:41:22
        Current exec time is(task) : 2017-08-29 15:41:25
        Current exec name is(task) : schedule1
         */


        /**
         * 2.时间等于或超过time首次执行task
         *   之后每隔period毫秒重复执行一次task
         *   如在2017-08-29 00:00:00第一次执行task,打印任务名字
         *   之后每隔两秒执行一次task
         */
        //myTimerTask.setName("schedule2");
        /*
        每隔2秒都去执行一次task:
        距离当前时间3秒钟之后首次执行task,之后的每隔两秒都会重复执行myTimerTask里面的run方法中的内容
        */
        //timer.schedule(myTimerTask,calendar.getTime(),2000L);

        /*
        执行结果:
        Current exec time is : 2017-08-29 15:51:16
        Current exec time is(task) : 2017-08-29 15:51:19
        Current exec name is(task) : schedule2
        Current exec time is(task) : 2017-08-29 15:51:21
        Current exec name is(task) : schedule2
        ...
         */


        /**
         * 3.等待delay毫秒后仅执行且执行一个task
         *   如现在是2017-08-29 00:00:00
         *   则在2017-08-29 00:00:01执行一次task,打印任务名字
         */
        //myTimerTask.setName("schedule3");
        //timer.schedule(myTimerTask,1000L);

        /*
        执行结果:
        Current exec time is : 2017-08-29 16:01:29
        Current exec time is(task) : 2017-08-29 16:01:30
        Current exec name is(task) : schedule3
         */


        /**
         * 4.等到delay毫秒后首次执行task
         *   之后每隔period毫秒重复执行一次task
         *   如现在是2017-08-29 00:00:00
         *   则在2017-08-29 00:00:01第一次执行task,打印任务名字
         *   之后每隔两秒执行一次task
         */
        //myTimerTask.setName("schedule4");
        //timer.schedule(myTimerTask,1000L,2000L);

        /*
        执行结果:
        Current exec time is : 2017-08-29 16:04:03
        Current exec time is(task) : 2017-08-29 16:04:04
        Current exec name is(task) : schedule4
        Current exec time is(task) : 2017-08-29 16:04:06
        Current exec name is(task) : schedule4
        Current exec time is(task) : 2017-08-29 16:04:08
        Current exec name is(task) : schedule4
        ...
         */
    }
}
二、scheduleAtFixedRate的两种用法

1.scheduleAtFixedRate(task, time, period)

参数
    task:所要安排的任务
    time:首次执行任务的时间
    period:执行一次task的时间间隔,单位是毫秒
作用
    时间等于或超过time时首次执行task
    之后每隔period毫秒重复执行一次task

ss1.jpg

2.scheduleAtFixedRate(task, delay, period)

参数
    task:所要安排的任务
    delay:执行任务前的延迟时间,单位是毫秒
    period:执行一次task的时间间隔,单位是毫秒
作用
    等到delay毫秒后首次执行task
    之后每隔period毫秒重复执行一次task

ss2.jpg

代码演示:

调度的业务逻辑类与上面一致

定时调度类:

package com.hcx.timer;

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

/**
 * Created by HCX on 2017/8/28.
 * 定时调度类
 */
public class MyTimer {

    public static void main(String[] args){

        //创建一个Timer实例(位于java.util包下的)
        Timer timer = new Timer();
        //创建一个MyTimerTask实例
        MyTimerTask myTimerTask = new MyTimerTask("hcx");
        /*
         * 通过Timer定时定频率调用MyTimerTask的业务逻辑
         * 即第一次执行是在当前时间的两秒钟之后,之后每隔一秒钟执行一次
         */
        //timer.schedule(myTimerTask,2000L,1000L);
        /**
         * 获取当前时间,并设置成距离当前时间三秒之后的时间
         * 如当前时间是2017-08-29 23:59:57
         * 则设置后的时间则为2017-8-30 00:00:00
         */
        Calendar calendar = Calendar.getInstance();
        // 定义日期格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current exec time is : " + simpleDateFormat.format(calendar.getTime()));
        //设置距离当前时间3秒之后的时间
        calendar.add(Calendar.SECOND,3);

        // scheduleAtFixedRate的两种用法
        /**
         * 1.时间等于或超过time时首次执行task
         *   之后每隔period毫秒重复执行一次task
         *   如在2017-08-29 00:00:00第一次执行task,打印任务名字
         *   之后每隔两秒执行一次task
         */
        //myTimerTask.setName("scheduleAtFixedRate1");
        //timer.scheduleAtFixedRate(myTimerTask,calendar.getTime(),2000L);
        /*
        执行结果:
        Current exec time is : 2017-08-29 16:15:23
        Current exec time is(task) : 2017-08-29 16:15:26
        Current exec name is(task) : scheduleAtFixedRate1
        Current exec time is(task) : 2017-08-29 16:15:28
        Current exec name is(task) : scheduleAtFixedRate1
        Current exec time is(task) : 2017-08-29 16:15:30
        Current exec name is(task) : scheduleAtFixedRate1
        ...
         */

        /**
         * 2.等待delay毫秒后首次执行task
         *   之后每隔period毫秒重复执行一次task
         *   如现在是2017-08-29 00:00:00
         *   则在2017-08-29 00:00:01第一次执行task,打印任务名字
         *   之后每隔两秒执行一次task
         */
        myTimerTask.setName("scheduleAtFixedRate2");
        timer.scheduleAtFixedRate(myTimerTask,1000L,2000L);
        /*
        执行结果:
        Current exec time is : 2017-08-29 16:18:39
        Current exec time is(task) : 2017-08-29 16:18:40
        Current exec name is(task) : scheduleAtFixedRate2
        Current exec time is(task) : 2017-08-29 16:18:42
        Current exec name is(task) : scheduleAtFixedRate2
        Current exec time is(task) : 2017-08-29 16:18:44
        ...
         */

    }
}

总结:timer通过schedule或者scheduleAtFixedRate函数,都能实现对task的一次或者多次的定时调度,我们只需要告诉它需要执行task的时间和频率,就能完成对task的定时定频率的调度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值