JAVA基础--Timer定时任务调度的简单应用

时间任务调度,我们一定不会陌生,那么今天就来看看JDK中的时间任务调度工具Timer;

什么是定时任务调度:
    基于给定的时间点,给定的时间间隔或者给定的执行次数 自动执行的任务;

Timer简介: 有且仅有 一个后台线程 对 多个业务线程 进行 定时定频率的调度;

关于Timer的测试代码:

1, 首先创建任务 MyTimerTask 继承 TimerTask 重写 run():

package timer;

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

public class MyTimerTask extends TimerTask{
    
    private String name;
    
    private int count = 0;

    public MyTimerTask() {}

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

    public String getName() {
        return name;
    }

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

    @Override
    public void run() {
        SimpleDateFormat sf  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            //测试 schedule() 与  scheduleAtFixedRate() 区别:
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(count<5){
            System.out.println("当前Task名称:" + name + ", 执行时间:" + sf.format(scheduledExecutionTime()));
            count++;
        } else {
            //结束当前任务
            cancel(); 
            System.out.println("TimerTask "+name+" is cancel(), count="+count+", 最后执行时间:"+ sf.format(scheduledExecutionTime()));
        }
    }
    

}

2, Timer 调用测试:

package timer;

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

public class MyTimer {

    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        MyTimerTask myTimerTask = new MyTimerTask("NO.1.1");

        Calendar calender = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间: " + sf.format(calender.getTime()));

        // ------------schedule的四种用法----------
        /**
         * 1, schedule(Task,Date time);在时间等于或着超过time的时候执行且执行一次task;
         */
        //calender.add(Calendar.SECOND, 3);
        // timer.schedule(myTimerTask, calender.getTime());

        /**
         * 2, schedule(task, Date firstTime, long period); 参数说明: task: 执行任务,
         * firstTime: 首次执行时间, period: 执行时间间隔(毫秒) 作用:
         * 时间等于或超过time时首次执行task,之后每隔period毫秒执行一次task;
         */
        // myTimerTask.setName("NO.1.2");
        // timer.schedule(myTimerTask, calender.getTime(), 2000L);

        /**
         * 3, schedule(TimerTask task, long delay); 作用: 等待 delay 毫秒后 执行且执行一次
         * task
         */
        // myTimerTask.setName("NO.1.3");
        // timer.schedule(myTimerTask, 1000L);

        /**
         * 4, schedule(TimerTask task, long delay, long period) 作用: 等待 delay毫秒后
         * 执行第一次 task,之后没隔 period毫秒执行一次;
         */
        // myTimerTask.setName("NO.1.4");
        // timer.schedule(myTimerTask, 2000L, 1000L);

        // ---------------scheduleAtFixedRate的两种用法---------------

        /**
         * 5, scheduleAtFixedRate(TimerTask task, long delay, long period); 作用:
         * 与4相同;
         */
        // myTimerTask.setName("NO.1.5");
        // timer.scheduleAtFixedRate(myTimerTask, 2000L, 1000L);

        /**
         * 6, scheduleAtFixedRate(TimerTask task, Date firstTime, long period);
         * 作用: 与2相同;
         */
        // myTimerTask.setName("NO.1.6");
        // timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 2000L);

        // ---------------------------其他函数用法------------------------------------
        /**
         * 7, cancel(); 作用: 终止此计时器,丢弃所有当前已安排的任务;
         */
        // MyTimerTask myTimerTask2 = new MyTimerTask("NO.2.1");
        // timer.scheduleAtFixedRate(myTimerTask2, calender.getTime(), 2000L);

        // Thread.sleep(5000L);
        // timer.cancel();
        // System.out.println("timer is cancel()");

        /**
         * 8, purge(); 作用: 从此计时器的任务队列中移除所有已取消的任务,并返回从队列中移除的任务数;
         */
        // myTimerTask2.cancel();
        // int number = timer.purge();
        // System.out.println("timer is purge() number=" + number);

        // ---------schedule 和 scheduleAtFixedRate的区别:-------------

        /* 1, 首次计划执行的时间早于当前的时间时; */
        
        //设置开始执行时间为当前时间六秒前
//        calender.add(Calendar.SECOND, -6);
        /**
         * 9, schedule(); 
         *   "fixed-delay", 如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行的时间点进行计算;
         */
//        timer.schedule(myTimerTask, calender.getTime(), 1000L);

        /**
         * 10, scheduleAtFixedRate(); 
         *   "fixed-rate",如果第一次执行时间被delay了,随后执行时间按照上一次开始时间点进行计算,
         *  并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步;
         */
//        timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L);
        
        /* 2, 任务执行所需时间超出任务的执行周期间隔时; */
        /**
         * 11, schedule();
         *  下次执行时间相对上次实际执行完成的时间点,因此执行时间会不断延后
         * */
//        timer.schedule(myTimerTask, calender.getTime(), 1000L);
        /**
         * 12, scheduleAtFixedRate();
         *  下次执行时间相对上次实际执行开始的时间点,因此执行时间不会延后,存在并发性;
         * */
        timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L);
        
        
        
        //------------------Timer的缺陷及使用禁区----------------------
        /**
         * 天生的两种缺陷:
         *  1, 管理并发任务的缺陷;
         *      Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符;
         *  
         *  2, 当任务抛出异常时的缺陷;
         *      如果TimerTask抛出RuntimeException, Timer会停止所有的任务运行;
         * 
         * 使用禁区:
         *  1, 对时效性要求较高的多任务并发作业;
         *  
         *  2, 对复杂任务的调度;
         * */
        
        
        

    }

}

猜你喜欢

转载自my.oschina.net/u/3681868/blog/1607286