背景:
A系统向activemq发送消息,B系统以监听的方式从activemq接收消息,因为这些消息都是转换文件,是CPU消耗型的服务,而服务器都是多CPU,为了充分利用CPU资源,B系统以多线程方式处理消息,这里用到了线程池,假设线程池最大线程数量是8(和CPU数量相等),但是在接收消息的时候,发现B系统把所有的消息都接收下来,放在了线程池的队列中,这样就产生问题了,如果B系统down掉的话,所有的消息都会丢失。
其实我想要的效果是,如果线程池中工作队列里的任务数量大于一定值的时候,B系统的消息接收监听器就阻塞,不要再从activemq中接收消息,通过查看线程池ThreadPoolExecutor源码
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
else if (!addIfUnderMaximumPoolSize(command))
reject(command); // is shutdown or saturated
}
}
发现工作队列BlockingQueue在插入任务的时候,执行的是workQueue.offer(),该函数并不会阻塞插入任务的操作,其实应该用workQueue.put()函数,这个函数会产生等待,直到工作队列BlockingQueue中的任务数量下降。
解决方案:
继承ArrayBlockingQueue,重写offer函数,代码如下
package cn.sh.ideal.pool;
import java.util.concurrent.ArrayBlockingQueue;
public class ArrayBlockingQueueReplaceOffer<E> extends ArrayBlockingQueue<E> {
public ArrayBlockingQueueReplaceOffer(int capacity) {
super(capacity);
}
@Override
public boolean offer(E e){
try {
super.put(e);
return true;
} catch (InterruptedException e1) {
e1.printStackTrace();
return false;
}
}
}
在初始化线程池的时候,使用ArrayBlockingQueueReplaceOffer,这样就达到了阻塞的目的
new ThreadPoolExecutor(8, 8,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueueReplaceOffer <Runnable>(8))
已经有人把阻塞式的处理请求提交到了 Java Bug 数据库(Bug Id 6648211,“ThreadPoolExecutor 特性需求
”)
分享到:
相关推荐
主要介绍了java线程池工作队列饱和策略代码示例,涉及线程池的简单介绍,工作队列饱和策略的分析及代码示例,具有一定参考价值,需要的朋友可以了解下。
针对中平能化首山焦化公司饱和器煤气出口管道堵塞问题,分析原因,并通过在出口中心管道上安装喷洒管和改变操作工艺,不但解决了饱和器煤气管道堵塞问题,而且硫铵质量和设备腐蚀问题也得到了改善。
基于饱和效应的面贴式永磁同步电动机转子初始位置检测,杜金明,安群涛,研究了一种简单有效的永磁同步电动机转子初始位置检测方法。该方法通过在电机定子绕组施加特定的电压信号,由于电机的饱和凸极效
详细讲述了数字PID 中积分饱和和微分饱和的处理办法!
项目描述:对java.util.concurrent包下线程池相关源码进行重新实现,深入研究和学习线程池超时机制、饱和策略、生命周期等知识 ThreadPoolExecutor类下部分方法和内部类介绍: 1、Worker类: 描述:Worker类实现...
电感具备的磁饱和特性 电感会因为磁心材料的不同,表现出不一样的磁饱和特性,即当电感内磁通量达到一定值时,就不会再增加。根据这一特性,人们将具有磁饱和特征的电感叫饱和电感 具体表现为:磁滞回线矩形比高,...
基于彩色相机的非接触式血氧饱和度提取,孔令琴,赵跃进,本文提出了一种利用网络摄像头的非接触式血氧饱和度测量方法。接触式血氧饱和度仪虽已得到广泛使用,但其在很多情况下是不适用的
脉搏血氧饱和度检测系统是一种将血氧浓度的光电检测技术与容积脉搏描记技术结合起来 ...脉搏血氧饱和度检测系统中干扰的主要来源、处理方法及其应用现状, 从而为脉搏血氧饱和度检 测系统设计提供了依据。
本文是结合博客http://blog.csdn.net/eastmount/article/details/41668583关于android图像增强处理的。通过点击“打开图片”按钮选择本地图像,再通过3SeekBar按钮实现滑动修改图片的饱和度、色相和亮度。 免费资源...
磁环电感及饱和磁通计算 磁环电感及饱和磁通计算 磁环电感及饱和磁通计算
磁饱和式可控电抗器在无功补偿中的应用 磁饱和式可控电抗器在无功补偿中的应用
磁饱和可控电抗器式无功补偿技术是以磁饱和可控电抗器为基础的,本文通过介绍其基本结构和工作原理,阐述了这种无功补偿技术所具有的可快速、准确、平滑、合理地调节系统的无功功率的特点。并通过在鹤煤公司三矿变电站...
包含1.位置型PID控制算法2.增量型PID控制算法3.积分分离PID控制算法4.抗积分饱和PID控制算法5.梯形积分PID控制算法6..变积分PID控制算法的C语言实现
OpenCV在iOS端的集成及Mat和UIImage互相转化以及 使用OpenCV处理图片的亮度、对比度、曝光、高光、阴影、饱和度、色温,色相(附源码)
磁饱和式可控电抗器原理介绍.doc
利用matlab进行图形图像处理,可以实现把灰暗图片的色彩提亮,增强图片色彩效果和饱和度,将主体从背景凸显出来。
饱和水汽压公式总结
本资源基于Unity实现了调整屏幕亮度、饱和度、对比度。效果见博客→https://zhyan8.blog.csdn.net/article/details/130958521
三极管有三个工作区间:截止、放大和饱和,三极管达到饱和时工作电流是最大的,那么怎么设计使三极管工作在饱和区呢? 三极管的基本原理 为了让新手更了解三极管的用法,下面先简单介绍一下三极管的基本原理,...