[java]打造阻塞式线程池

原来以为tiger已经自带了这种线程池,就是在任务数量超出时能够阻塞住投放任务的线程,主要想用在JMS消息监听。

开始做法:
在ThreadPoolExcecutor中代入new ArrayBlockingQueue(MAX_TASK). 在任务超出时报错:RejectedExecutionException。

后来不用execute方法加入任务,直接getQueue().add(task), 利用其阻塞特性。但是发现阻塞好用了,但是任务没有被处理。一看Queue,晕啊,原来都在里面,任务池就没处理它。看样还是要走任务池。

最后自己重载了一个BlockedThreadPoolExecutor:

None.gif   private  ReentrantLock pauseLock  =   new  ReentrantLock();
None.gif 
private  Condition unpaused  =  pauseLock.newCondition();
None.gif @Override
ExpandedBlockStart.gifContractedBlock.gif 
public   void  execute(Runnable command)  dot.gif {
InBlock.gif  pauseLock.lock();
ExpandedSubBlockStart.gifContractedSubBlock.gif  
try dot.gif{
InBlock.gif   
while (getPoolSize()==getMaximumPoolSize() && getQueue().remainingCapacity()==0)
InBlock.gif    unpaused.await();
InBlock.gif   
super.execute(command);//放到lock外面的话,在压力测试下会有漏网的!
ExpandedSubBlockStart.gifContractedSubBlock.gif
  }
 catch (InterruptedException e) dot.gif{
InBlock.gif   log.warn(
this, e);
ExpandedSubBlockStart.gifContractedSubBlock.gif  }
 finally dot.gif{
InBlock.gif   pauseLock.unlock();
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif }

None.gif @Override
ExpandedBlockStart.gifContractedBlock.gif 
protected   void  afterExecute(Runnable r, Throwable t)  dot.gif {
InBlock.gif  
super.afterExecute(r,t);
ExpandedSubBlockStart.gifContractedSubBlock.gif  
trydot.gif{
InBlock.gif   pauseLock.lock();
InBlock.gif   unpaused.signal();
ExpandedSubBlockStart.gifContractedSubBlock.gif  }
finallydot.gif{
InBlock.gif   pauseLock.unlock();
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif }

None.gif

多线程程序很容易出错,写好了要拼命的用压力测试,否则问题多多啊~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值