相关疑难解决方法(0)

如何让ThreadPoolExecutor在排队之前将线程增加到最大值?

我已经沮丧了一段时间,其默认行为ThreadPoolExecutor支持ExecutorService我们这么多人使用的线程池.引用Javadocs:

如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程.

这意味着如果您使用以下代码定义线程池,它将永远不会启动第二个线程,因为它LinkedBlockingQueue是无限制的.

ExecutorService threadPool =
   new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/,
      TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */));
Run Code Online (Sandbox Code Playgroud)

只有当您有一个有界队列并且队列已满时才会启动核心编号之上的任何线程.我怀疑大量的初级Java多线程程序员并不知道这种行为ThreadPoolExecutor.

现在我有一个特定的用例,这不是最佳的.我正在寻找方法,而不是编写我自己的TPE课程来解决它.

我的要求是针对可能不可靠的第三方回拨的Web服务.

  • 我不想与web-request同步回调,所以我想使用一个线程池.
  • 我通常会得到一些这样的一分钟,所以我不希望有newFixedThreadPool(...)大量的线程,大多数都处于休眠状态.
  • 我经常会遇到这种流量的爆发,我想将线程数量扩大到某个最大值(比方说50).
  • 我需要尽最大努力做所有回调,所以我想排队50以上的任何额外的回调.我不想通过使用a来压倒我的网络服务器的其余部分newCachedThreadPool().

更多线程启动之前,如何解决ThreadPoolExecutor队列需要限制和填充的限制?如何让它排队任务之前启动更多线程?

编辑:

@Flavio提出了使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)核心线程超时并退出的好处.我考虑过这一点,但我仍然想要核心线程功能.如果可能的话,我不希望池中的线程数降到核心大小以下.

java multithreading blockingqueue threadpoolexecutor

90
推荐指数
5
解决办法
2万
查看次数

核心池大小与ThreadPoolExecutor中的最大池大小

当我们谈论ThreadPoolExecutor时,核心池大小和最大池大小之间究竟有什么区别?可以借助一个例子来解释吗?

threadpoolexecutor

74
推荐指数
6
解决办法
7万
查看次数