spring定时任务的一些疑问

若有多个任务,任务是单线程还是多线程执行的?若是单线程,执行顺序是怎样的?

多个 job 在同一个线程中执行;有同时执行的多个 job 时,这些 job 的执行顺序不定

设置了 cron,如果任务用时超过了给定的时间间隔将会如何?

在一个时间间隔内,如果一轮任务还没跑完,则下一轮任务的执行时间将会推后一个时间间隔,以此类推。

设置了 fixedRate,如果任务用时超过了设置的 fixedRate 值将会如何?

若任务用时超过 fixedRate 值,则下一轮任务会紧接在本轮任务后进行。

定义的定时任务,是怎么执行的?

主要还是 JDK 的 ScheduledThreadPoolExecutor 类,最大核心线程数是
Integer.MAX_VALUE,每个 @Scheduled 定义的方法都会共用一个线程池,但只有 1
个核心线程数,一个定时任务执行时间太久,会阻塞别的定时任务执行,主要类:org.springframework.scheduling.config.ScheduledTaskRegistrar
在这里插入图片描述

怎么一个定时任务多线程执行

  1. @Async 和 @Scheduled,问题:如果队列长度为0,拒绝策略是 CallerRunsPolicy ,主线程阻塞,别的也会进行阻塞,原因:
    在这里插入图片描述
  2. 自定义线程池执行
ScheduledExecutorService parseExcelThreadPool = ThreadPoolUtils.getParseExcelThreadPool();
for (int i = 0; i < ThreadPoolUtils.PARSE_EXCEL_THREAD_NUMBER; i++) {
	parseExcelThreadPool.scheduleWithFixedDelay(
		() -> dataAnalyzeTaskService.doTask()
		, 0
		, 1
		, TimeUnit.SECONDS
	);
}

上面说到:一个定时任务执行时间太久,会阻塞别的定时任务执行,那么怎么实现能并行执行定义的定时任务呢?

  1. 实现 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);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值