java多线程 ThreadPoolExecutor 策略的坑
无论是使用jdk的线程池ThreadPoolExecutor 还是spring的线程池ThreadPoolTaskExecutor 都会使用到一个阻塞队列来进行存储线程任务。
当线程不够用时,则将后续的任务暂存到 阻塞队列中,等待有空闲线程来进行。
当这个阻塞队列满了的时候,会出现两种情况
正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;
正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会通过一个策略进行对后续的任务进行处理。
四种策略
ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy() 重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务
其他很容易看出来,最近踩了一个ThreadPoolExecutor.CallerRunsPolicy()的坑。
情景是这样的:我需要通过线程进行创建长连接,当开启了15个线程的是,线程池最大即达到了maximumPoolSize的数量的时候,继续增大请求量,会无缘无故的多出来
一个长连接,由于有负载均衡,导致了很多请求无法从长连接中得到。
经过很长时间的测试,最终发现了是ThreadPoolExecutor.CallerRunsPolicy()策略导致的。
这个测试是当你的线程数达到最大,阻塞队列也满了的时候,之后的任务会强制先执行,但是没有了线程谁来执行呢,这个策略会强制中断主线程进行执行这个任务。
即是说,当我的量上来,线程池不够用的时候,中断了我的主线程,主线程没有长连接,就建立了一个新的长连接,那边进行了负载均衡,但是这边不会在进行主线程了,
导致很多请求接收不到。
假设队列大小为 10,corePoolSize 为 3,maximumPoolSize 为 6,那么当加入 20 个任务时,执行的顺序就是这样的:首先执行任务 1、2、3,然后任务 4~13 被放入队列。这时候队列满了,任务 14、15、16 会被马上执行,最终顺序是:1、2、3、14、15、16、4、5、6、7、8、9、10、11、12、13。
踩坑完毕
最终做法:
换成ThreadPoolExecutor.DiscardPolicy()策略,还是从已经建立的连接中进行 的到请求,不要继续创建连接。
转载于:https://www.cnblogs.com/lic309/p/4564507.html
java多线程 ThreadPoolExecutor 策略的坑相关推荐
- 转: java多线程-ThreadPoolExecutor的拒绝策略RejectedExecutionHandler
转自: https://blog.csdn.net/qq_25806863/article/details/71172823 概述 原文地址 http://blog.csdn.net/qq_2580 ...
- Java多线程编程系列-多线程基础
导语 如果想要深入的了解一个东西就需要不断的接近他,这样才能了解到其核心的东西.这个系列就来了解一下Java多线程.开始入坑吧! 在入坑之前先来看一个例子!! public class Tes ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程-任务拒绝策略
Java多线程-任务拒绝策略 简介 Rejected tasks New tasks submitted in method execute(Runnable) will be rejected wh ...
- JAVA多线程之扩展ThreadPoolExecutor
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- Java多线程相关的几十个问题
转载来源:http://www.cnblogs.com/HadesFX/p/5333810.html , https://www.cnblogs.com/HadesFX/p/5333820.html ...
- java复习系列[2] - Java多线程
文章目录 JUC thread 线程状态 sleep() 与 wait() 的异同点 wait() 与 阻塞 的异同点 Some Question !!! 有了**sleep()**为什么还要有**w ...
- java多线程及线程池使用
Java多线程及线程池的使用 Java多线程 一.Java多线程涉及的包和类 二.Java创建多线程的方式 三.Java线程池 1. 创建线程池ThreadPoolExecutor的7个参数 2. 线 ...
最新文章
- 重磅 | TensorFlow 2.0即将发布,所有tf.contrib将被弃用
- opencv相机标定
- eclipse如何使用log4j详解,你get了吗???
- 统一六国的另一个法宝
- (51)SSDT HOOK 实现进程保护
- 通过反射获取带参构造方法并使用
- Java——获取和设置多线程的名称
- 在IT界取得成功应该知道的10件事(ZT)
- Maven--Cargo远程部署
- 数据库 课程设计 仓库管理系统
- 前端项目:基于Nodejs+vue开发实现高校学院网站系统
- unity 使用超椭圆方程对图片进行裁切制作圆角矩形
- 计算机勾兑双绝是谁发明,勾兑大师范玉平之“舌尖上的五粮液”
- h5 android 字体设置,解决因为手机设置字体大小导致h5页面在webview中变形的BUG
- S32K系列之ADC
- C++11 Features in Visual C++ 11 - VS2010对C++11特性支持的情况
- 【ASH】如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据
- 将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。输出逆序后数组的整数,每两个整数之间用空格分隔。
- 一篇文章带你了解大数据生态圈---大数据组件图谱
- C#制作屏幕捕捉程序
热门文章
- 在Visual C++ 中使用内联汇编
- 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan
- windows——celery
- java.math.BigDecimal()的用法
- 未能在全局命名空间中找到类型或命名空间名称“Wuqi”
- 类的大小,虚函数,继承
- UVA 10405 - Longest Common Subsequence
- OpenCV基本的阈值操作
- datagirdview跟据内容自动适应单元格大小
- SAP的Cloud Platform增加了多云支持和商业语义