Java实现定时器的方式,以及timer的schedule和scheduleAtFixedRate方法的区别

 Java实现定时器的方式:

package com.wxltsoft.tool;
 
import org.junit.Test;
 
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 

public class TimerUtil {
 
    public static void main(String[] args) {
        timer1();
        timer2();
        timer3();
        timer4();
    }
 
    /**
     * 设定2000毫秒后执行
     */
    public static void timer1(){
        Timer nTimer = new Timer();
        nTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("----设定要指定任务-----");
            }
        },2000);
    }
 
    /**
     * 延迟5000毫秒,每1000毫秒执行一次
     */
    public static void timer2() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("-------延迟5000毫秒,每1000毫秒执行一次--------");
            }
        }, 5000, 1000);
    }
 
    /**
     * 延迟5000毫秒,每1000毫秒执行一次
     */
    public static void timer3() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.err.println("-------延迟5000毫秒,每1000毫秒执行一次--------");
            }
        }, 5000, 1000);
    }
    /**
     * 设置01:00(凌晨1点)执行任务
     * java.util.Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
     */
    public static void timer4() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 1);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
 
        Date time = calendar.getTime();
 
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.out.println("-------设定要指定任务--------");
            }
        }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
    }
 
 
}

其中,timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别, 只有在当前任务没有来得及完成,下次任务又交到手上时,处理方式不一样。

方便理解,我们来举个例子:

暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业。

老师要求学生暑假每天写1页,30天后完成作业。

这两个学生每天按时完成作业,直到第20天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业。任务被拖延了。

这时候两个学生采取的策略就不同:

schedule重新安排了任务时间,旅游回来的第一天做第21天的任务,第二天做第22天的任务,最后完成任务花了35天。

scheduleAtFixedRate是个守时的学生,她总想按时完成老师的任务,于是在旅游回来的第一天把之前5天欠下的任务以及第26天当天的任务全部完成了,之后还是按照老师的原安排完成作业,最后完成任务花了30天。

你可能感兴趣的:(java语言)