若有多个任务,任务是单线程还是多线程执行的?若是单线程,执行顺序是怎样的?
多个 job 在同一个线程中执行;有同时执行的多个 job 时,这些 job 的执行顺序不定
设置了 cron,如果任务用时超过了给定的时间间隔将会如何?
在一个时间间隔内,如果一轮任务还没跑完,则下一轮任务的执行时间将会推后一个时间间隔,以此类推。
设置了 fixedRate,如果任务用时超过了设置的 fixedRate 值将会如何?
若任务用时超过 fixedRate 值,则下一轮任务会紧接在本轮任务后进行。
定义的定时任务,是怎么执行的?
主要还是 JDK 的 ScheduledThreadPoolExecutor 类,最大核心线程数是
Integer.MAX_VALUE,每个 @Scheduled 定义的方法都会共用一个线程池,但只有 1
个核心线程数,一个定时任务执行时间太久,会阻塞别的定时任务执行,主要类:org.springframework.scheduling.config.ScheduledTaskRegistrar
怎么一个定时任务多线程执行
- @Async 和 @Scheduled,问题:如果队列长度为0,拒绝策略是 CallerRunsPolicy ,主线程阻塞,别的也会进行阻塞,原因:
- 自定义线程池执行
ScheduledExecutorService parseExcelThreadPool = ThreadPoolUtils.getParseExcelThreadPool();
for (int i = 0; i < ThreadPoolUtils.PARSE_EXCEL_THREAD_NUMBER; i++) {
parseExcelThreadPool.scheduleWithFixedDelay(
() -> dataAnalyzeTaskService.doTask()
, 0
, 1
, TimeUnit.SECONDS
);
}
上面说到:一个定时任务执行时间太久,会阻塞别的定时任务执行,那么怎么实现能并行执行定义的定时任务呢?
- 实现 SchedulingConfigurer 重写 configureTasks 方法
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(
2
, new CustomizableThreadFactory("scheduledThread--")
);
taskRegistrar.setScheduler(scheduledThreadPoolExecutor);
}
}