概述
在一些非常狭窄的情况下,您可以实现一个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个短任务,你的一个线程调用执行卡住了一个大。
所以,我说。它很少需要,可能是危险的,但你去。
祝你好运。
最后
以上就是纯真书包为你收集整理的java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?的全部内容,希望文章能够帮你解决java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复