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)来使核心线程超时和退出。我考虑过,但是我仍然想要核心线程功能。我不希望池中的线程数尽可能降低到核心大小以下。