码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 线程池阻塞队列长度设置失误导致任务一直被阻塞未能执行


    1、生产环境中有个接口耗时比较久,然后自己的阻塞队列没有设置默认值,导致后续提交过来的任务一直在阻塞队列中,具体代码如下

    1. @Slf4j
    2. @RestController
    3. @RequestMapping(value = "/vman/task/run/")
    4. public class RunTask2Controller {
    5. // 阻塞队列没有设置,则默认是Integer.MAX_VALUE,而核心线程数是1,会导致后续提交的任务一直放在队列里
    6. private final ExecutorService executorService = new ThreadPoolExecutor(1,5, 180L, TimeUnit.SECONDS,
    7. new LinkedBlockingQueue(), new ThreadFactoryBuilder().setNameFormat("thread-repeater-run-%d").build());
    8. private ExecutorService repeaterExecutorService = TransferExecutors.getTtlExecutorService(executorService);
    9. @RequestMapping(value = "/run_job2", method = RequestMethod.GET)
    10. public BasicResult runTask2(@RequestParam(value = "id") String id) throws SQLException {
    11. BasicResult<RunTaskResult> basicResult = new BasicResult<>();
    12. final String userName = UserInfoHolder.getUserOa();
    13. log.info("run_job请求参数信息1,userName:{},id:{}", userName, JSONObject.toJSONString(id));
    14. repeaterExecutorService.execute(new Runnable() {
    15. @Override
    16. public void run() {
    17. log.info("run_job请求参数信息2,userName:{},id:{}", userName, JSONObject.toJSONString(id));
    18. try {
    19. Thread.sleep(10000000);
    20. } catch (InterruptedException e) {
    21. throw new RuntimeException(e);
    22. }
    23. }
    24. });
    25. basicResult.setCodeMessage("0", "任务执行中");
    26. return basicResult;
    27. }
    28. }

    2、线程池的执行逻辑

    1. 如果workerCount < corePoolSize,则创建并启动一个线程来执行新提交的任务;
    2. 如果workerCount >= corePoolSize,且线程池内的阻塞队列未满,则将任务添加到该阻塞队列中;
    3. 如果workerCount >= corePoolSize && workerCount < maximumPoolSize,且线程池内的阻塞队列已满,则创建并启动一个线程来执行新提交的任务;
    4. 如果workerCount >= maximumPoolSize,并且线程池内的阻塞队列已满, 则根据拒绝策略来处理该任务, 默认的处理方式是直接抛异常。

    3、更加上述线程池执行逻辑,因为业务执行很长时间,而阻塞队列设置很大,则导致后续提交的任务都放到阻塞队列了,从而导致任务挤压。改进措施,根据任务执行时间合理设置LinkedBlockingQueue的大小,比如设置20个,最大线程数也设置大点。

    Java线程池实现原理及其在美团业务中的实践 - 美团技术团队

  • 相关阅读:
    算法提升:图的最小生成树算法-克鲁斯卡尔(Kruskal)
    算法竞赛进阶指南 基本算法 0x01 位运算
    STM32CubeMX教程5 TIM 定时器概述及基本定时器
    数据治理项目成功的要点,企业培养数据要把握好关键环节
    高级前端手写面试题
    Linux,虚拟机
    2.5python 循环_python量化实用版教程(初级)
    我,土木人,时隔7年转行计算机,差点放弃了
    【Docker 内核详解】namespace 资源隔离(四):Mount namespace & Network namespace
    安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等
  • 原文地址:https://blog.csdn.net/wppwpp1/article/details/134072514
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号