相关疑难解决方法(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命令等待?

我从队列服务器获取数据,我需要处理它并发送确认.像这样的东西:

while (true) {
    queueserver.get.data
    ThreadPoolExecutor //send data to thread
    queueserver.acknowledgement 
Run Code Online (Sandbox Code Playgroud)

我不完全理解线程中发生了什么,但我认为这个程序获取数据,发送线程然后立即确认它.所以即使我有一个每个队列的限制只能有200个未确认的项目,它只会拉到它可以接收它的速度.当我在单个服务器上编写程序时,这很好,但是如果我使用多个工作程序,那么这就成了一个问题,因为线程队列中的项目数量不是它完成的工作的反映,而是它的速度有多快可以从队列服务器获取项目.

如果线程队列充满工作,我能以某种方式使程序等待吗?

java multithreading

10
推荐指数
1
解决办法
3579
查看次数