无论是使用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 策略的坑相关推荐

  1. 转: java多线程-ThreadPoolExecutor的拒绝策略RejectedExecutionHandler

    转自:  https://blog.csdn.net/qq_25806863/article/details/71172823 概述 原文地址 http://blog.csdn.net/qq_2580 ...

  2. Java多线程编程系列-多线程基础

    导语   如果想要深入的了解一个东西就需要不断的接近他,这样才能了解到其核心的东西.这个系列就来了解一下Java多线程.开始入坑吧!   在入坑之前先来看一个例子!! public class Tes ...

  3. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  4. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  5. Java多线程-任务拒绝策略

    Java多线程-任务拒绝策略 简介 Rejected tasks New tasks submitted in method execute(Runnable) will be rejected wh ...

  6. JAVA多线程之扩展ThreadPoolExecutor

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. Java多线程相关的几十个问题

    转载来源:http://www.cnblogs.com/HadesFX/p/5333810.html , https://www.cnblogs.com/HadesFX/p/5333820.html ...

  8. java复习系列[2] - Java多线程

    文章目录 JUC thread 线程状态 sleep() 与 wait() 的异同点 wait() 与 阻塞 的异同点 Some Question !!! 有了**sleep()**为什么还要有**w ...

  9. java多线程及线程池使用

    Java多线程及线程池的使用 Java多线程 一.Java多线程涉及的包和类 二.Java创建多线程的方式 三.Java线程池 1. 创建线程池ThreadPoolExecutor的7个参数 2. 线 ...

最新文章

  1. 重磅 | TensorFlow 2.0即将发布,所有tf.contrib将被弃用
  2. opencv相机标定
  3. eclipse如何使用log4j详解,你get了吗???
  4. 统一六国的另一个法宝
  5. (51)SSDT HOOK 实现进程保护
  6. 通过反射获取带参构造方法并使用
  7. Java——获取和设置多线程的名称
  8. 在IT界取得成功应该知道的10件事(ZT)
  9. Maven--Cargo远程部署
  10. 数据库 课程设计 仓库管理系统
  11. 前端项目:基于Nodejs+vue开发实现高校学院网站系统
  12. unity 使用超椭圆方程对图片进行裁切制作圆角矩形
  13. 计算机勾兑双绝是谁发明,勾兑大师范玉平之“舌尖上的五粮液”
  14. h5 android 字体设置,解决因为手机设置字体大小导致h5页面在webview中变形的BUG
  15. S32K系列之ADC
  16. C++11 Features in Visual C++ 11 - VS2010对C++11特性支持的情况
  17. 【ASH】如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据
  18. 将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。输出逆序后数组的整数,每两个整数之间用空格分隔。
  19. 一篇文章带你了解大数据生态圈---大数据组件图谱
  20. C#制作屏幕捕捉程序

热门文章

  1. 在Visual C++ 中使用内联汇编
  2. 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan
  3. windows——celery
  4. java.math.BigDecimal()的用法
  5. 未能在全局命名空间中找到类型或命名空间名称“Wuqi”
  6. 类的大小,虚函数,继承
  7. UVA 10405 - Longest Common Subsequence
  8. OpenCV基本的阈值操作
  9. datagirdview跟据内容自动适应单元格大小
  10. SAP的Cloud Platform增加了多云支持和商业语义