实现方案
实现调研
应该在不少场景中都会有这种需求,需要Java原生的ScheduleThreadPool支持Cron表达式来指定调度时间,为了满足这种需求,实现了CronScheduledThreadPool。
在实现初,构想了下实现方案,最后觉得将Java8中的ScheduledThreadPoolExecutor进行拓展比较简单高效。
那么如果按照这个方案实现会遇到哪些问题呢?
- 不能直接通过继承ScheduledThreadPoolExecutor来实现
因为ScheduledThreadPoolExecutor中调用了各种默认权限的方法与变量(包访问权限),其内部的一个任务包装类ScheduledFutureTask也是private的,无法重写。 - cron表达式如何解析
那么以上两个问题该怎么解决。
cron表达式的问题比较容易,可以通过集成第三方的工具cron-utils。 而ScheduledThreadPoolExecutor无法继承,那只能将jdk中的类复制出来了。
方案细节
- ScheduledThreadPoolExecutor的实现原理在这里就不做过多的说明了,这里主要想说明的是其中的ScheduledFutureTask。
看下它的构造方法:
/**
* Creates a periodic action with given nano time and period.
*/
ScheduledFutureTask(Runnable r, V result, long ns, long period) {
super(r, result);
this.time = n