一个java定时器框架

简介:

ScheduleIterator接口

import java.util.Date;

public  interface ScheduleIterator 
{
    public Date next();//获取下一个触发的时间点
}


Scheduler类

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public  class Scheduler 
{
    class SchedulerTimerTask extends TimerTask 
    {
        private SchedulerTask schedulerTask;
        private ScheduleIterator iterator;
        public SchedulerTimerTask(SchedulerTask schedulerTask,ScheduleIterator iterator)
        {
            this.schedulerTask = schedulerTask;
            this.iterator = iterator;
        }

        public void run() 
        {
            schedulerTask.run();
            reschedule(schedulerTask, iterator);
        }

    }


    private final Timer timer = new Timer();

    public Scheduler() 
    {
    }

    public void cancel() 
    {
        timer.cancel();
    }

    public void schedule(SchedulerTask schedulerTask,ScheduleIterator iterator) 
    {
        Date time = iterator.next();
        if (time == null
        {
            schedulerTask.cancel();
        }

        else 
        {
            synchronized(schedulerTask.lock)
            {
                if (schedulerTask.state != SchedulerTask.VIRGIN) 
                {
                    throw new IllegalStateException("Task already scheduled " +
                        "or cancelled");
                }

                schedulerTask.state = SchedulerTask.SCHEDULED;
                schedulerTask.timerTask = new SchedulerTimerTask(schedulerTask, iterator);
                timer.schedule(schedulerTask.timerTask, time);
            }

        }

    }


    private void reschedule(SchedulerTask schedulerTask,ScheduleIterator iterator)
    {
        Date time = iterator.next();
        if (time == null)
        {
            schedulerTask.cancel();
        }
 
        else 
        {
            synchronized(schedulerTask.lock)
            {
                if (schedulerTask.state != SchedulerTask.CANCELLED) 
                {
                    schedulerTask.timerTask = new SchedulerTimerTask(schedulerTask, iterator);
                    timer.schedule(schedulerTask.timerTask, time);
                }

            }

        }

    }

}


SchedulerTask 类

import java.util.TimerTask;

public  abstract  class SchedulerTask implements Runnable 
{//被调度器不断调度执行的任务

    final Object lock = new Object();

    int state = VIRGIN;//任务状态
    static final int VIRGIN = 0;
    static final int SCHEDULED = 1;
    static final int CANCELLED = 2;

    TimerTask timerTask;//底层的定时器任务
    protected SchedulerTask() 
    {
    }

    public abstract void run();//调度任务执行的具体任务
    public boolean cancel() 
    {
        synchronized(lock
        {
            if (timerTask != null
            {
                timerTask.cancel();//取消任务
            }

            boolean result = (state == SCHEDULED);//任务已经被调度执行
            state = CANCELLED;//设置任务状态为“取消”
            return result;
        }

    }

    public long scheduledExecutionTime()
    {
        synchronized(lock
        {
            return timerTask == null ? 0 : timerTask.scheduledExecutionTime();//任务执行时间
        }

    }


}


DailyIterator类:

import java.util.Calendar;
import java.util.Date;

public  class DailyIterator implements ScheduleIterator  {
    private final int hourOfDay, minute, second;
    private final Calendar calendar = Calendar.getInstance();

    public DailyIterator(int hourOfDay, int minute, int second)
    {
        this(hourOfDay, minute, second, new Date());
    }


    public DailyIterator(int hourOfDay, int minute, int second, Date date)
    {
        this.hourOfDay = hourOfDay;
        this.minute = minute;
        this.second = second;
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, 0);
        if (!calendar.getTime().before(date)) 
        {
            calendar.add(Calendar.DATE, -1);
        }

    }


    public Date next()
    {//获取下一个触发的时间点
        calendar.add(Calendar.DATE, 1);
        return calendar.getTime();
    }


}



测试类:

import java.text.SimpleDateFormat;

import java.util.Date;

import org.tiling.scheduling.Scheduler;
import org.tiling.scheduling.SchedulerTask;
import org.tiling.scheduling.examples.iterators.DailyIterator;

public  class AlarmClock 
{

    private final Scheduler scheduler = new Scheduler();//调度器
    private final SimpleDateFormat dateFormat =
        new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");
    private final int hourOfDay, minute, second;//每天触发的时间点 

    public AlarmClock(int hourOfDay, int minute, int second) 
    {
        this.hourOfDay = hourOfDay;
        this.minute = minute;
        this.second = second;
    }


    public void start() 
    {
        scheduler.schedule(new SchedulerTask() 
        {
            public void run() 
            {
                soundAlarm();
            }

            private void soundAlarm()
            {
                System.out.println("Wake up! " +
                    "It's " + dateFormat.format(new Date()));
                // Start a new thread to sound an alarm
            }

        }
new DailyIterator(hourOfDay, minute, second));//通过迭代器模式迭代遍历得到后面一系列的时间点
    }


    public static void main(String[] args) 
    {
        AlarmClock alarmClock = new AlarmClock(2250);
        alarmClock.start();
    }

}

参考资料

Scheduling recurring tasks in Java applications

相关文章
|
11月前
|
数据可视化 应用服务中间件 nginx
Docker如何连接至本地私服Harbor中 推送镜像、查看镜像、下载镜像
Docker如何连接至本地私服Harbor中 推送镜像、查看镜像、下载镜像
862 0
|
3天前
|
人工智能 运维 安全
|
1天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
794 109
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
355 9
|
2天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。