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);
        }
    }

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:spring定时任务的一些疑问-创新互联
文章出自:http://scyanting.com/article/ddhisd.html