前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java ThreadPoolExecutor的拒绝策略CallerRunsPolicy的一个潜在的大坑

Java ThreadPoolExecutor的拒绝策略CallerRunsPolicy的一个潜在的大坑

作者头像
明明如月学长
发布2021-08-31 15:07:17
3.2K0
发布2021-08-31 15:07:17
举报
文章被收录于专栏:明明如月的技术专栏

一、背景

前面一篇文章转载了 ThreadPoolExecutor的几种拒绝策略:https://cloud.tencent.com/developer/article/1870310,讲得很不错。

 但是网上介绍使用拒绝策略遇到的大坑的文章不多。

本文介绍其中一个真是故障的场景。

二、问题描述

ThreadPoolExecutor的拒绝策略常用的是DiscardPolicy或者DiscardOldestPolicy。

但是有个应用使用的拒绝策略是CallerRunsPolicy。

Java手册对这个策略的描述是:

handler for rejected tasks that runs the rejected task directly in the calling thread of the execute method, unless the executor has been shut down, in which case the task is discarded. CallerRunsPolicy在任务被拒绝添加后,会在调用execute方法的的线程来执行被拒绝的任务。 除非executor被关闭,否则任务不会被丢弃。

如果最大线程池设置较小,而且工作队列数不够大,由于代码Bug等导致任务量激增。

任务会交个上层线程(主线程)执行,导致主线程既要处理其他任务,又要忙碌处理线程池的源源不断的大量任务,导致hang住。

进而导致线上故障。

因此我们创建新线程池的时候,要考虑线程数量,队列的长度,有使用CachedThreadPool 和 ScheduledThreadPool线程池,由于代码bug,导致创建大量的线程,从而导致线上OOM的故障。

《阿里巴巴Java开发手册》的提示不容忽略:

【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: 1)FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 2)CachedThreadPool 和 ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

还要想清楚使用的拒绝策略带来的风险。

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。 另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。 https://t.zsxq.com/Z3bAiea  申请时标注来自CSDN。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、问题描述
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档