java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?

在一些非常狭窄的情况下,您可以实现一个java.util.concurrent.RejectedExecutionHandler,它可以满足您的需要。

RejectedExecutionHandler block = new RejectedExecutionHandler() {

rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

executor.getQueue().put( r );

}

};

ThreadPoolExecutor pool = new ...

pool.setRejectedExecutionHandler(block);

现在。这是一个很坏的主意,原因如下

>它很容易死锁,因为池中的所有线程可能会死在你放入队列的东西是可见的。通过设置合理的保活时间来缓解这一点。

>任务不包裹你的执行者可能期望的方式。许多执行器实现在执行之前将其任务封装在某种跟踪对象中。看看你的来源。

> API强烈不建议通过getQueue()添加,并且可能在某些时候禁止。

一个几乎总是更好的策略是安装ThreadPoolExecutor.CallerRunsPolicy,它将通过在调用execute()的线程上运行任务来调节你的应用程序。

然而,有时一个拥有所有内在风险的封锁策略,实际上是你想要的。我会说在这些条件

>你只有一个线程调用execute()

>你必须(或想)有一个非常小的队列长度

>你绝对需要限制运行此工作的线程数量(通常出于外部原因),而调用者运行策略会破坏它。

>你的任务是不可预测的大小,所以调用者运行可能会引入饥饿,如果池暂时忙于4个短任务,你的一个线程调用执行卡住了一个大。

所以,我说。它很少需要,可能是危险的,但你去。

祝你好运。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值