单点任务管理器

单点定时任务的几种实现方式

1、多线程

  就是启个线程,然后写一个for循环,每完成一次sleep一下,示例忽略

2、Timer

  Timer类是JDK自带的定时任务类

复制代码
public class TimeTaskTest {
    static long count = 0;
    public static void main(String[] args) {
        TimerTask timer4Task = new TimerTask() {
            @Override
            public void run() {
                count++;
                System.out.println(count);
            }
        };
        //创建timer对象设置间隔时间
        Timer timer = new Timer();
        // 间隔天数
        long delay = 0;
        // 间隔毫秒数
        long period = 1000;
        timer.scheduleAtFixedRate(timer4Task, delay, period);
    }
}
复制代码

 

3、线程池

  线程池则是通过创建一个只有一个线程的线程池,调用延迟方法

 ScheduledThreadPoolExecutor
复制代码
public class ThreadPoolTest {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            public void run() {
                // task to run goes here
                System.out.println("Hello !!");
            }
        };
        // 创建一个只有一个线程的线程池
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
        service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);
    }

}
复制代码

 

4、使用Quartz框架

  Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。
  中文官方文档:https://www.w3cschool.cn/quartz_doc/quartz_doc-h9582d84.html
  详细介绍:https://www.cnblogs.com/zjh-ds/p/16160885.html
5、使用 @Scheduled 注解实现定时任务
  
复制代码
@Configuration
@EnableScheduling
public class SpringScheduleTaskTest {

    //添加定时任务-- 秒执行一次(表达式)
    //@Scheduled(cron = "*/5 * * * * ?")
    // 延迟,单位毫秒
    @Scheduled(fixedDelay = 1000)
    private void updateTask() {
        System.out.println("@Scheduled 注解实现定时任务 执行-------------------" + System.currentTimeMillis());
    }
}
复制代码

Trigger 触发方式:https://blog.csdn.net/lcgskycby/article/details/112724461

Spring @Scheduled原理
参考文档:https://wenku.baidu.com/view/f7cda43868d97f192279168884868762caaebbb9.html
  此注解主要使用的是Spring的BeanPostProcessor和ApplicationListener的特性来实现的。
  首先实现了BeanPostProcessor,调用postProcessAfterInitialization方法,在对象实例化后,扫描每个示例是否有注解Scheduled.class, Schedules.class,如果有则新建一个Runnable,这个Runnable用一个成员属性保存这个bean的对象引用,run执行的时候通过反射调用这个被注解标记的方法。
  其次实现了ApplicationListener,调用onApplicationEvent方法,将上方创建的线程放入线程池中
  具体查看源码:org.springframework.scheduling.annotation.EnableScheduling
 

ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。

如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。这种事件机制都必须需要程序显示的触发。

  
posted @   HZare  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示