Questions tagged «blockingqueue»

9
如何在排队之前让ThreadPoolExecutor将线程增加到最大数量?
我一直对默认行为ThreadPoolExecutor支持ExecutorService很多人使用的线程池感到沮丧。引用Javadocs: 如果运行的线程数量超过corePoolSize但少于maximumPoolSize,则仅在队列已满时才创建新线程。 这意味着,如果使用以下代码定义线程池,则它将永远不会启动第二个线程,因为该线程LinkedBlockingQueue是无界的。 ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */)); 仅当您有一个受限制的队列并且该队列已满时,才会启动高于核心号的任何线程。我怀疑大量的初级Java多线程程序员都没有意识到这种行为ThreadPoolExecutor。 现在,我有一个特定的用例,它不是最佳的。我正在寻找无需编写自己的TPE类的方法来解决该问题的方法。 我的要求是要对可能不可靠的第三方进行回调的Web服务。 我不想与Web请求同步进行回调,因此我想使用线程池。 我通常一分钟会收到几个,所以我不想拥有newFixedThreadPool(...)大量休眠的线程。 我每隔一段时间就会收到大量此类流量,我想将线程数扩展到某个最大值(比如说50)。 我需要尽最大的努力来完成所有回调,所以我希望将大于50的所有其他队列排队newCachedThreadPool()。 我如何解决此限制,ThreadPoolExecutor即在需要启动更多线程之前队列必须被限制为已满的地方?如何在排队任务之前启动更多线程? 编辑: @Flavio很好地说明了使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)来使核心线程超时和退出。我考虑过,但是我仍然想要核心线程功能。我不希望池中的线程数尽可能降低到核心大小以下。

6
阻塞队列和多线程使用者,如何知道何时停止
我有一个单一的线程生产者,它创建一些任务对象,然后将它们添加到一个ArrayBlockingQueue(具有固定大小)中。 我还启动了一个多线程使用者。这是作为固定线程池(Executors.newFixedThreadPool(threadCount);)构建的。然后,我向该threadPool提交一些ConsumerWorker实例,每个ConsumerWorker都引用了上述ArrayBlockingQueue实例。 每个这样的Worker将take()在队列中执行并处理任务。 我的问题是,什么时候不再需要其他工作,让工人知道的最佳方法是什么。换句话说,我如何告诉工人生产者已完成添加到队列,从这一点开始,每个工人在看到队列为空时都应停止。 我现在得到的是一个设置,其中,生产者使用一个回调初始化,当他完成工作(向队列中添加内容)时触发该回调。我还保留了我创建并提交给ThreadPool的所有ConsumerWorkers的列表。当生产者回叫告诉我生产者完成时,我可以将此告知每个工人。在这一点上,他们应该继续检查队列是否不为空,当队列为空时,它们应该停止,从而使我能够正常关闭ExecutorService线程池。是这样的 public class ConsumerWorker implements Runnable{ private BlockingQueue<Produced> inputQueue; private volatile boolean isRunning = true; public ConsumerWorker(BlockingQueue<Produced> inputQueue) { this.inputQueue = inputQueue; } @Override public void run() { //worker loop keeps taking en element from the queue as long as the producer is still running or …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.