我是靠谱客的博主 纯真书包,最近开发中收集的这篇文章主要介绍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个短任务,你的一个线程调用执行卡住了一个大。

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

祝你好运。

最后

以上就是纯真书包为你收集整理的java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?的全部内容,希望文章能够帮你解决java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部