Java Timer定时器的四种方法

Timer定时任务代码简洁,用的较为广泛,但除了传递TimerTask外,还有后面的一些参数在使用时,容易搞混淆,所以我特意从源码中找出来,整理一下。

    1.当传递的参数只有一个long类型的delay时,就是延迟delay毫秒执行一次,但线程不会被销毁

public void schedule(TimerTask task, long delay) {
	if (delay < 0)
		throw new IllegalArgumentException("Negative delay.");
	sched(task, System.currentTimeMillis()+delay, 0);
}

例如:

    public static void main(String[] args) throws ParseException {
        long delay = 1000;//1毫秒
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,delay);
    }

会在延迟1000毫秒后输出当前时间戳一次,但程序不会结束运行 。

  2.当传递的参数只有一个Date类型的time时,就是任务在time时刻开始执行一次

public void schedule(TimerTask task, Date time) {
	sched(task, time.getTime(), 0);
}

 例如:

    public static void main(String[] args) throws ParseException {
        Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-09-09 11:40:00");
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,time);
    }

会在2020-09-09 11:40:00时刻输出当前时间戳一次,但程序不会结束运行 。

    3.当传递的参数有一个long类型的delay和一个long类型的period时,就是延迟delay毫秒后, 每隔period毫秒执行一次

public void schedule(TimerTask task, long delay, long period) {
	if (delay < 0)
		throw new IllegalArgumentException("Negative delay.");
	if (period <= 0)
		throw new IllegalArgumentException("Non-positive period.");
	sched(task, System.currentTimeMillis()+delay, -period);
}

例如: 

   public static void main(String[] args) throws ParseException {
        long delay = 1000;//1毫秒
        long period = 1000;//1毫秒
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,delay,period);
    }

 会在延迟1000毫秒后执行一次输出当前时间戳,然后每隔一秒执行一次输出当前时间戳。

    4.当传递的参数有一个Date类型的firstTime和一个long类型的period时,就是在firstTime开始执行第一次,然后每隔 period毫秒执行一次

public void schedule(TimerTask task, Date firstTime, long period) {
	if (period <= 0)
		throw new IllegalArgumentException("Non-positive period.");
	sched(task, firstTime.getTime(), -period);
}

例如:

  public static void main(String[] args) throws ParseException {
        Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-09-09 11:40:00");
        System.out.println(time);
        long period = 5000;//5毫秒
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,time,period);
    }

会在2020-09-09 11:40:00时刻执行一次输出当前时间戳,然后每隔5秒执行一次

我整理一个表格方便记忆查询

四种参数 任务执行方式 任务执行次数
schedule(TimerTask task, long delay) 延迟delay毫秒执行 执行一次
schedule(TimerTask task, Date time) 在time时刻开始执行 执行一次
schedule(TimerTask task, long delay, long period) 延迟delay毫秒后执行一次,然后每隔period毫秒执行一次 无限执行
schedule(TimerTask task, Date firstTime, long period) 在firstTime时刻开始执行一次,然后每隔 period毫秒执行一次 无限执行

猜你喜欢

转载自blog.csdn.net/c_o_d_e_/article/details/108485322