原创

ScheduledThreadPoolExecutor定时任务源码研究实现原理及注意事项

任务出错后不执行

线程池初始化,实际未启动,corePoolSize 100,实际每次申请worker都不会超过此值;

executor.scheduleAtFixedRate()//添加任务,并启动线程池中的worker

run中必须catch所有exception,否则该任务出错不会再执行

img

具体原因如下:

ScheduledThreadPoolExecutor重写了ThreadPoolExecutor
ScheduledFutureTask重写了FutureTask,实际worker执行的是ScheduledFutureTask中的run方法,run失败是不会添加下一次任务,如下图所示。

img

删除任务

删除任务必须用future.cancel,而非pool.getQueue().remove(future),因为实际上pool.getQueue()往往为空或小于实际任务书,因为正在执行的任务不在queue中

img

正文到此结束