在用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作为