spring里面的定时任务的理解

本文探讨了Spring定时任务的实现原理,指出其基于ScheduledThreadPoolExecutor,利用DelayedWorkQueue来实现定时。通过分析ScheduledFutureTask类和RunnableScheduledFuture接口,揭示了任务周期性执行的逻辑。Spring通过ReschedulingRunnable实现任务的重新调度,即使得定时任务能够按预设周期重复执行。
摘要由CSDN通过智能技术生成

在用spring自带的定时任务编写业务代码时,只需要在类上面加上@Scheduled注解并配上cron表达式即可完成一个定时任务的开发,那么这个注解的背后原理是什么样的呢?

其实spring并没有自创什么定时任务处理器,它也是用的java提供的ScheduledThreadPoolExecutor这个类实现的定时任务,所以搞清楚这个类的实现原理,也就明白了spring的定时任务的实现原理

首先看一下ScheduledThreadPoolExecutor的继承关系

可以看到这个类本身就是一个ThreadPoolExecutor,这和我们平时使用线程池去异步执行任务的方式是一样的,也就是说我们的定时器也是通过一个线程池、任务队列来实现我们的定时任务执行的。但是ScheduledThreadPoolExector和ThreadPoolExecutor还是有不同的地方,这个不同的地方也就是定时器和异步执行任务的执行方式上的区别。

我们先看一下如何创建一个ScheduledThreadPoolExector的:

    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }

这是其中的一个构造函数,可以看到这个构造函数实际上也是调用的父类的构造函数,点击去看一下:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

可以看到,这其实就是ThreadPoolExecutor的构造函数,只不过是它的任务队列是用的DelayedWorkQueue,也就是说ScheduledThreadPoolExector和ThreadPoolExecutor的最大区别也就ScheduledThreadPoolExector用DelayedWorkQueue作为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值