博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadPoolTaskExecutor遇到的坑
阅读量:3753 次
发布时间:2019-05-22

本文共 1385 字,大约阅读时间需要 4 分钟。

在利用org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor实现请求的慢处理时,我的配置中核心线程数为5,最大线程数为10,但是代码中创建了8个队列放在线程池中,假如我用idhash取模,得到队列集合下标,将数据放到集合的队列中,此时就会出现8个队列中,每个队列都有数据,但只有前5个队列中的请求被处理,后3个队列的请求被搁置。

因此,配置线程池的线程最少数量时,一定要大于等于自己创建的队列数量。
出现此问题的真正原因:
如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。如果使用了无界的任务队列这个参数就没什么效果

关键配置及代码:

代码实现如下:

/**  * 懒汉式单例可以实现传参的单例初始化 */public class RequestProcessorThreadPool {	private volatile static RequestProcessorThreadPool instance = null;	private RequestProcessorThreadPool() {	}	private RequestProcessorThreadPool(ApplicationContext applicationContext) {		RequestQueue requestQueue = RequestQueue.getInstance();		ThreadPoolTaskExecutor threadPool = (ThreadPoolTaskExecutor) applicationContext.getBean("deviceBindExecutor");		/** 		 * 给线程池中加入任务队列		 */		for (int i = 0; i < 8; i++) {			ArrayBlockingQueue
queue = new ArrayBlockingQueue
(100); requestQueue.addQueue(queue); threadPool.submit(new RequestProcessorThread(queue)); } } public static RequestProcessorThreadPool getInstance(ApplicationContext applicationContext) { if (instance == null) { synchronized (RequestProcessorThreadPool.class) { if (instance == null) { instance = new RequestProcessorThreadPool(applicationContext); } } } return instance; }}

转载地址:http://ytcsn.baihongyu.com/

你可能感兴趣的文章
spring boot
查看>>
Angular框架
查看>>
行为型模式:模板方法
查看>>
spring cloud之Feign的使用
查看>>
Billboard HDU - 2795(树状数组,单点修改,区间查询)
查看>>
Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
查看>>
LeetCode刷题 --杂篇 --数组,链表,栈,队列
查看>>
840. 模拟哈希表(模板)
查看>>
《算法》笔记 17 - 数据压缩
查看>>
Qt Installer Framework翻译(5-2)
查看>>
Java+Selenium+Testng自动化测试学习(三)— 断言
查看>>
PAT乙级1012
查看>>
银行业务队列简单模拟(队列queue)
查看>>
MySql中的数据查询语言(DQL)三:连接查询
查看>>
MySql中的数据查询语言(DQL)五:union和limit
查看>>
数据操作语言(DML)一:插入数据insert、修改数据update、删除delete
查看>>
.properties 文件,.yml 文件 ,yaml文件语法学习
查看>>
jsp 的常用标签
查看>>
Listener 监听器
查看>>
SpringBoot自动配置原理
查看>>