spring 定时任务 多任务并行执行,多任务多线程 单任务单线程执行实现细节
前提:spring 定时任务,默认是多任务单线程执行,也就是串行执行的
当前需求:
1. 多任务多线程执行(不同的定时任务并行执行)
2.同一个定时任务单线程执行(保证一个定时任务A在执行完成前,A的下一次执行不会开始)
需求实现:
方案一 ,针对@Scheduled的定时任务,增加配置文件,可实现不同@Scheduled定时任务多线程运行,代码如下
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;/*** spring定时任务 多任务多线程配置*/
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();//开启5个线程,执行现有的定时任务taskScheduler.setPoolSize(5);//设置线程池中,线程的命名前缀,方便识别那些线程是定时任务的taskScheduler.setThreadNamePrefix("cms-job-");taskScheduler.initialize();scheduledTaskRegistrar.setTaskScheduler(taskScheduler);}
}
方案二 ,原生JDK 实现多任务多线程执行,可以借助ScheduledThreadPool,核心代码如下
//JDK原生代码片段1 创建线程池
//一个任务一个线程池,且线程池中只配置一个执行线程,即实现单任务单线程执行
//如上,多个任务分别创建多个线程池对象ScheduledExecutorService ,即可实现多任务多线程
private static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);//JDK原生代码片段2 执行定时任务
// 2000代表首次延迟2秒执行
// 30*1000表示执行完成后,30S后再次运行定时任务
// scheduleWithFixedDelay 表示A任务执行完成后,30S后才将下次执行的A任务加入线程池
// scheduleAtFixedRate 表示以A任务开始执行时计时,30S后将下次执行的A任务加入线程队列,此时如果线程池是多个线程,会导致A任务并行执行,慎重
scheduledExecutorService.scheduleWithFixedDelay(() -> {try {execTask()//此处执行你的定时任务} catch (Throwable e) {log.error("充分捕获异常,保证定时任务不中断", e);}}, 2000,30*1000, TimeUnit.MILLISECONDS);
单任务单线程运行,针对@Scheduled,如下两种都是单任务单线程
@Scheduled(initialDelay = 3000, fixedDelay = 30 * 1000)
@Scheduled(cron="${time.cron}")
单任务多线程运行,需配置ScheduleConfig ,且做如下配置
@Scheduled(initialDelay = 3000, fixedRate = 30 * 1000)
spring 定时任务 多任务并行执行,多任务多线程 单任务单线程执行实现细节相关推荐
- spring定时任务(Scheduled)运行阻塞不执行/Redission分布式锁阻塞问题
spring定时任务(Scheduled)运行阻塞不执行/Redission分布式锁阻塞问题 最近项目中发现一个bug,排查了很久,最后发现问题所在,在此记录一下. 问题描述: 项目运行一段时间后,c ...
- 多线程和单线程执行效率比较
单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的彩绘执行到. 多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群 ...
- Spring定时任务@scheduled多线程的使用(@Async注解)
1.开篇 在Spring定时任务@Scheduled注解使用方式浅窥这篇文章里面提及过,spring的定时任务默认是单线程的,他在某些场景下会造成堵塞,那么如果我们想让每一个任务都起一条线程去执行呢? ...
- Spring定时任务-多线程配置
目前常见的定时任务框架有Quarts.Elastic-Job.xxl-job等.但其实SpringBoot也有一个内置的定时任务框架,不需要引入额外的Jar,使用Spring自带的注解就可以,比Qua ...
- 什么是单线程和多线程,单线程与多线程的区别
什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的 ...
- 浅谈Spring定时任务
浅谈Spring定时任务 三种定时任务基于原理 多定时任务并发配置 动态定时任务 定时任务Demo 三种定时任务基于原理 SpringBoot配置定时任务主要有Spring Schedule.JDK自 ...
- 【定时任务】——Spring定时任务Scheduled
定时任务在日常开发过程中非常常见,而且在日常的项目开发中也有多种实现方式,而且做任务调度的框架有很多种,小编最近的感受,如果想真正使用好任务调度还是存在困难的,所以分步学习,逐个击破!在这篇文章小编主 ...
- Python多任务(1.多任务的介绍、并发和并行概念及小例子)
目录 1.多任务的概念 2.单核CPU是怎么解决多任务的? 3.多任务的执行方式:并发和并行 4.单任务的执行例子: 5.多任务的执行例子: 1.多任务的概念 简单地说,就是操作系统可以同一时间执行多 ...
- Python 多线程比单线程慢?
看到一个说多线程比单线程慢的帖子,我惊呆了 赶紧测试了一下 说多线程比单线程慢那兄弟就是喝高了! 单线程和多线程分别进行 10*100万次运算 得出结果,多线程速度远超单线程 至于为什么 绝大多帖都说 ...
最新文章
- Error APICloud iOS null is not an object
- MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)
- 【django】查询集QuerySet
- GTK+ VS MFC
- php fopen 图片下载,php curl与fopen下载远程服务器图片实例
- gjr garch Matlab,基于Copula-ARIMA-GJR-GARCH模型的股票指数相关性分析
- 数学学习的心理——关于数学中的挫败的反思及若干启示
- Semaphore实现原理分析
- java输出到txt,换行问题
- python pos函数_从0入门Python — 4. 函数
- elastic-Job配置参数详细解释
- 无法安装程序包“xxx”。你正在尝试将此程序包安装到目标为“.NETFramework,Version=v4.5”的项目中
- 好用的网页操作自动化软件
- 在哪自学python_怎么自学python,大概要多久?
- 【号外】马云这次帮了大忙,银行卡再也不用怕被盗刷!
- win10 ST-GCN复现
- [Python]networkx入门
- mysql5.1为什么programdata文件夹里只有frm文件
- java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...
- SpringMVC的执行流程源码分析?
热门文章
- 多行宏:未识别的标记
- 【教程】好多好看好酷的代码注释,喜欢就选一个;还可以将自己喜欢的图片一键生成代码注释
- 新版gsp药店计算机操作规程,2017最新版GSP单体药店质量管理制度及岗位职责及操作规程.doc...
- hightcharts制作饼状图
- 刀塔omg塔防去限制版使用方法
- oracle的索引在哪儿看,Oracle如何查看索引和视图
- HIT软件构造——从一个实际案例考察开发质量目标
- 苹果id登录_手机小技巧公众号:iPhone忘记ID密码怎么办?不花钱,这波操作帮你轻松解决...
- High-grade and low-grade tumor
- mysql 和 redis 的区别总结