欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现定时器功能

程序员文章站 2022-07-10 20:23:20
...

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实现定时器功能
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实现定时器功能

方法二:使用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实现定时器功能
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实现定时器功能

定时器工具类
各类定时器方法,及定时器终止方法
有多个定时器,终止指定定时器实现方法如下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);
        }
    }
}

相关标签: 实现功能 java