场景描述

在使用Springboot整合定时任务,发现当某个定时任务执行出现执行时间过长的情况时会阻塞其他定时任务的执行。

问题定位

后续通过翻查Springboot的文档以及打印日志(输出当前线程信息)得知问题是由于Springboot默认使用只有1个线程的单线程池处理定时任务。

问题复盘

需要注意示例的Springboot版本为2.1.3.RELEASE。

@Component

@Log4j2public classScheduledTask {

@Scheduled(cron= "0/5 * * * * ?")public void task1() throwsInterruptedException {

log.info("I am task11111111, current thread: {}", Thread.currentThread());while (true) {//模拟耗时任务,阻塞10s

Thread.sleep(10000);break;

}

}

@Scheduled(cron= "0/5 * * * * ?")public voidtask2() {

log.info("I am task22222222, current thread: {}", Thread.currentThread());

}

}

2019-04-24 17:11:15.008 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]2019-04-24 17:11:15.009 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[scheduling-1,5,main]2019-04-24 17:11:25.009 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]2019-04-24 17:11:30.002 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]2019-04-24 17:11:30.003 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task11111111, current thread: Thread[scheduling-1,5,main]2019-04-24 17:11:40.004 INFO 16868 --- [ scheduling-1] com.example.demo.task.ScheduledTask : I am task22222222, current thread: Thread[scheduling-1,5,main]

由结果可见,task1与task2由同一个线程Thread[scheduling-1,5,main]执行,也即该定时任务默认使用单线程,并且由于task1阻塞了10s,导致本应5s执行一次的定时任务10s才执行一次。

解决方法

由于使用的Springboot版本为2.1.3.RELEASE,所以有两种方法解决这个问题

使用Springboot配置

在配置文件中可以配置定时任务可用的线程数:

## 配置可用线程数为10

spring.task.scheduling.pool.size=10

自定义定时任务的线程池

使用自定义的线程池代替默认的线程池

/*** 定时任务配置类

*@authorRJH

* create at 2019-03-29*/@Configurationpublic classScheduleConfig {/*** 此处方法名为Bean的名字,方法名无需固定

* 因为是按TaskScheduler接口自动注入

*@return

*/@BeanpublicTaskScheduler taskScheduler(){//Spring提供的定时任务线程池类

ThreadPoolTaskScheduler taskScheduler=newThreadPoolTaskScheduler();//设定最大可用的线程数目

taskScheduler.setPoolSize(10);returntaskScheduler;

}

}

java定时器阻塞主线程_springboot定时任务线程阻塞踩坑相关推荐

  1. 定时线程_SpringBoot定时任务,@Async多线程异步执行

    一.使用SpringBoot实现定时任务 这个不是重点,就简单的实现一下,至于cron表达式怎么写也不是重点,自行百度即可. 1-1.基于 @Scheduled 注解的方式 import org.sp ...

  2. java用毫秒数做日期计算的一个踩坑记录

    错误示例: Date today = new Date(); Date nextMonth = new Date(today.getTime() + 30* 1000*60*60*24); print ...

  3. java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...

    python科学计算数据应用(第2版) 156.4元 (需用券) 去购买 > 1. 踩坑经历 上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERR ...

  4. java面试,自我介绍这样说可以少踩坑

    为什么需要自我介绍?简历上面不是都有么? 1)面试官争取在仅有的时间内快速浏览简历: 2)面试官通过让面试者自我介绍来缓冲一下面试气氛,使面试者不过于太紧张影响其发挥能力. 3)对面试者有一个大体对了 ...

  5. java定时器阻塞主线程_Java基础_死锁、线程组、定时器Timer

    一.死锁问题: 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 比如,线程一需要第一把所,此时锁处于空闲状态,给了 ...

  6. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...

    线程基本方法有哪些? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等. 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等 ...

  7. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

  8. android如何阻塞主线程,Android-Android如何避免阻塞主线程

    Android的Handler和AsyncTask,可以避免阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的. AsyncTask,它使创建需要与用户界面交互的长时间运 ...

  9. springboot主线程_SpringBoot(一) 多线程与异步

    多线程与异步 异步是目的,而多线程是实现这个目的的方法. 1 Java J.U.C线程调度 JDK 1.5新增的java.util.concurrent包,增加了并发编程的很多类. Executor ...

最新文章

  1. 中国在国际上首次提出全液态量子器件与计算技术概念
  2. 《系统分析与设计方法》 计算投资回收分析
  3. mysql数据类型不写(),MYSQL 数据类型
  4. javap查看class文件
  5. PHP中 下列哪个操作符用来连接字符串,PHP试题带答案
  6. WEB前端 Vue.js 的发展历史
  7. 卸载已经装的mysql_怎么卸载已经安装的mysql服务
  8. ifix如何设画面大小_如何让你的视频又小又清晰?视频编码输出软件来了
  9. Taro+react开发(33) Super expression must either be null or a function, not undefined
  10. Thinkphp 配置不用输入index.php
  11. mysql耦合_内聚与耦合
  12. 澳网:公茂鑫/张择创历史 中国男网夺大满贯首胜
  13. linux下配置Java和Go环境
  14. 奇怪的Residential Gateway Device设备
  15. 3700打印机和计算机连接,WNDR3700成功实现打印机服务器功能(刷机成WNDR3800)
  16. simpson积分模板
  17. FISCO BCOS源码(1)代码目录结构
  18. 计算机基础知识200分选择题,计算机基础考试题库及答案
  19. pyhon下实现通过身份证获取归属地的方法
  20. cloopen java_GitHub - cloopen/java-sms-sdk: Yuntongxun SMS SDK for Java

热门文章

  1. 数组对象去重的四种方式
  2. Set实现数组对象去重
  3. 转帖:惠普前总裁的职业观
  4. ajax 怎么input赋值,jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签...
  5. 燃气蒸汽发生器加以水处理设备辅助,事半功倍!
  6. mac查看支持字体:fc-list
  7. 荣耀2023届校园招聘内推码
  8. 市场调研-基于细胞的海鲜市场现状及未来发展趋势
  9. 汉服重现与中国的文艺复兴
  10. 易表.net v10.83 build 1717 bt