定时任务调度工具之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的定时定频率的调度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • Timer 定时器相信都不会陌生,之所以拿它来做源码分析,是发现整个控制流程可以体现很多有意思的东西。 在业务开发...
    石先阅读 6,288评论 2 13
  • 网络上关于java定时器的文章真的是错误百出,给我的学习造成了很大的困扰,Timer根本就没有线程安全问题,Tim...
    江江的大猪阅读 1,672评论 0 18
  • 前言 在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说...
    张丰哲阅读 29,751评论 15 57
  • 上次熟悉了MarkDown的用法之后,由于各种原因一直没有时间更新博客。。。这次打算把我之前总结的一些东西陆陆续续...
    niaoge2016阅读 2,016评论 0 2
  • 定时任务调度之Timer 前言 定时任务调度,有两个比较重要的概念,一个是定时,一个是调度,所谓的定时调度,指的是...
    颜洛滨阅读 1,065评论 0 8