• JAVA定时任务系列(二、JDK原生定时工具:Timer)


    接上文......

    四、JDK原生定时工具:Timer

    (1) Timer介绍

    所在包:

    java.util.Timer
    java.util.TimerTask
    Timer(后台执行线程)对TimerTask(业务线程)的定时调用

    Timer是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,而且是一个抽象类,如下所示:

    可以通过继承该类,来实现自己的定时任务。

    public abstract class TimerTask implements Runnable

    • Timer定时器实例有多种构造方法:
    • 创建一个新计时器: Timer()
    • 创建一个新计时器,可以指定其相关的线程作为守护程序运行: Timer(boolean isDaemon)
    • 创建一个新计时器,其相关的线程具有指定的名称: Timer(String name)
    • 创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行:Timer(String name, boolean isDaemon)

    (2) Timer执行流程图

    (3) Timer方法

    定时执行方法

    1、在特定时间执行任务,只执行一次

    public void schedule(TimerTask task,Date time)
    

    2、在特定时间之后执行任务,只执行一次

    public void schedule(TimerTask task,long delay)
    

    3、指定第一次执行的时间,然后按照间隔时间,重复执行

    public void schedule(TimerTask task,Date firstTime,long period)
    

    4、在特定延迟之后第一次执行,然后按照间隔时间,重复执行

    public void schedule(TimerTask task,long delay,long period)
    

    参数说明:
    delay: 延迟执行的毫秒数,即在delay毫秒之后第一次执行
    period:重复执行的时间间隔

    5、第一次执行之后,特定频率执行,与3同

    public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
    

    6、在delay毫秒之后第一次执行,后按照特定频率执行

    public void scheduleAtFixedRate(TimerTask task,long delay,long period)
    

    方法名称schedule()和scheduleAtFixedRate()两者的区别:

    • schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
    • scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果任务执行时间大于period,会在任务执行之后马上执行下一次任务

    Timer注销

    timer.cancel();
    

    (4) Timer案例

    (4.1) 特定时间后执行

    public void schedule(TimerTask task,long delay)
    

    参数说明:

    • task为:执行任务
    • delay:时间毫秒数

    方法的含义:
    在delay毫秒后执行任务task,只执行一次。

    (4.2) 案例一

    1分钟后同步数据。

    案例实现:

    1. 同步任务:
    package com.yank.framework.common;
    
    import java.util.TimerTask;
    
    public class SynchroTimerTask extends TimerTask {
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("Synchro data to other servers.");        
        }
    
    }
    
    1. 定时任务:
    package com.yank.framework.common;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class SynchroTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            TimerTask task = new SynchroTimerTask();        
            Timer timer = new Timer();        
            timer.schedule(task, 1000);
        }
    
    }
    

    (4.3) 案例二

    按点吃饭

    首先定义吃饭的任务,制定饭点,没小时进行检查,到点就吃饭。

    package com.yank.framework.common;
    
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    import java.util.TimerTask;
    
    /*
     * 定时吃饭
     * */
    public class EatTimerTask extends TimerTask {
        
        //吃饭时间
        private static List<Integer> eatTimes;
        /*
         * 静态初始化
         * */
        static {
            initEatTimes();
        }
        
        /*
         * 初始化吃饭时间
         * */
        private static void initEatTimes(){
            eatTimes = new ArrayList<Integer>();
            eatTimes.add(8);
            eatTimes.add(12);
            eatTimes.add(18);
        }
    
        /*
         * 执行
         * */
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Calendar calendar = Calendar.getInstance();
            System.out.println("检查是否到了吃饭的点");
            int hour = calendar.get(Calendar.HOUR_OF_DAY);
            if(eatTimes.contains(hour))
            {
                System.out.println("饿了,吃饭...");
            }
        }
    
    }
    

    定时检查执行:

    package com.yank.framework.common;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class EatTimerTaskTest {
        public static void main(String[] arg){
            TimerTask task = new EatTimerTask();
            Calendar  calendar= Calendar.getInstance();    
            
            
            Date firstTime = calendar.getTime();
            //间隔:1小时
            long period = 1000 * 60 * 60;    
            //测试时间每分钟一次
            //period = 1000 * 60;        
            
            Timer timer = new Timer();        
            timer.schedule(task, firstTime, period);
        }
    }
    

    JAVA定时任务系列

    JAVA定时任务系列(一、基于注解,基于接口)
    JAVA定时任务系列(二、JDK原生定时工具:Timer)
    JAVA定时任务系列(三、定时任务框架Quartz)

  • 相关阅读:
    【iOS开发每日小笔记(十二)】仿Facebook登录界面 错误提示抖动 利用CAAnimation设置动画效果
    《跑酷好基友》(英文名:BothLive)隐私政策声明
    【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber
    【iOS开发每日小笔记(十)】自制带圆框的头像 利用在CALayer设置“寄宿图”
    【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法
    2018/3/29
    2018/3/26
    2018/3/25
    BZOJ[3091] 城市旅行
    2018/3/23
  • 原文地址:https://www.cnblogs.com/MrYuChen-Blog/p/14794488.html
Copyright © 2020-2023  润新知