3种定时器:
1. 设置指定任务在多少毫秒之后执行
2. 设置指定任务在多少毫秒之后,以多少毫秒为一周期持续执行
3. 设置指定任务在今天或明天几点开始执行,并且以多少毫秒为一周期持续执行

1. 设置指定任务在多少毫秒之后执行
实现方法:

private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) {
        System.err.println(sdf.format(new Date()));
        timer1();
    }
    
    public static void timer1() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("-------设定要指定任务-timer1--------" + sdf.format(new Date()));
            }
        }, 5000);	// 5000为延时多少毫秒执行,delay
    }

效果图:

java定时器依次执行 java定时器实现_java定时器依次执行


2. 设置指定任务在多少毫秒之后,以多少毫秒为一周期持续执行

方法一:使用Timer.schedule()

public static void timer2(){
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("-------设定要指定任务-timer2--------" + sdf.format(new Date()));
            }
        },3000,5000); // 3000为延时多少毫秒delay,5000为多少毫秒为一周期period
    }

效果:

java定时器依次执行 java定时器实现_定时任务_02

方法二:使用Timer.scheduleAtFixedRate()
实现方法:

public static void timer3(){
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("-------设定要指定任务-timer3--------" + sdf.format(new Date()));
            }
        },3000,5000);
    }

效果:

java定时器依次执行 java定时器实现_定时任务_03


3. 设置指定任务在今天或明天几点开始执行,并且以多少毫秒为一周期持续执行

实现方法:

定时今天15:48:00开始执行任务、然后以1000毫秒为周期执行

public static void timer4(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 15);     //时
        calendar.set(Calendar.MINUTE,48);   //分
        calendar.set(Calendar.SECOND,0);    //秒
        Date time = calendar.getTime(); //得出执行任务的时间,此处为今天的12:00:00
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("-------设定要指定任务-timer4--------" + sdf.format(new Date()));
            }
        },time, 1000);   //这里设定将延时每天固定执行
    }

效果:

java定时器依次执行 java定时器实现_定时任务_04

定时器工具类
各类定时器方法,及定时器终止方法
有多个定时器,终止指定定时器实现方法如下stopTimer()方法

package com.gaohan.util;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;

import java.text.ParseException;
import java.util.*;

/**
 * @author gaohan
 * @version 1.0
 * @date 2020/5/8 22:59
 */
public class TimerUtils {
    private static Logger logger = (Logger) LogManager.getLogger(TimerUtils.class);

    private Timer timer = new Timer();

    public static Map<String, TimerTask> map = new HashMap<>();    //用来存储所有定时器

    /**
     * 延时执行定时任务
     * @param uuid  定时任务id
     * @param delay 延时时间(毫秒)
     */
    public void startTimerDelay(String uuid, long delay) throws Exception {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                logger.info("-------设定要指定任务--------");
            }
        };
        timer.schedule(task, delay);
//        TimerController.map.put(uuid, task);
    }

    /**
     * 延时并按周期循环执行定时任务
     * @param uuid  定时任务id
     * @param delay 延时时间(毫秒)
     * @param period  循环间隔时间(毫秒)
     * @param str   打印信息
     * @throws InterruptedException
     * @throws ParseException
     */
    public void startTimerDelayPeriod(final String uuid, long delay, long period, final String str) throws InterruptedException, ParseException {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                logger.info("====>  " + uuid + str);
            }
        };
        timer.scheduleAtFixedRate(task, delay, period);
        map.put(uuid, task);
    }

    /**
     * 设置指定任务TimerTask在今天指定时间开始执行,并且以固定的period毫秒为周期执行
     * @param uuid  定时任务id
     * @param period 周期(毫秒)
     * @param hour      几点
     * @param minute    几分
     * @param second    几秒
     */
    public void startTimerDelayPeriodByTime(String uuid, long period, int hour, int minute, int second){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);     //时
        calendar.set(Calendar.MINUTE, minute);   //分
        calendar.set(Calendar.SECOND, second);    //秒
        Date time = calendar.getTime(); //得出执行任务的时间,此处为今天的12:00:00
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("-------设定要指定任务--------");
            }
        };
        timer.scheduleAtFixedRate(task, time, period);   //这里设定将延时每天固定执行
        map.put(uuid, task);
    }

    /**
     * 停止定时任务
     * @param uuid  定时任务id
     */
    public void stopTimer(String uuid) {
        TimerTask task = map.get(uuid);
        if (task != null) {
            task.cancel();
            logger.info("====>  结束定时任务[" + uuid + "]");
            map.remove(uuid);
        }
    }
}