ThreadPoolExecutor参数配置

时间:2014-06-24 15:40:14

标签: java asynchronous threadpoolexecutor

我正在使用需要从Rest API请求数据的客户端应用程序。其中许多请求是独立的,因此可以异步调用它们。我使用ThreadPoolExecutor这样做,我已经看到它可以配置几个参数:

  • corePoolSize
  • maxPoolSize
  • queueCapacity

我读了this article,我理解以下内容:

  • corePoolSize是下面的值,执行者添加新线程而不是将其排队
  • maxPoolSize是执行程序对请求进行排队的值
  • 如果实际线程数在corePoolSize和maxPoolSize之间,请求将排队。

但我有一些问题:

  • 我一直在测试,corePoolSize越高,我得到的效果就越好。在一个生产环境中,有很多客户请求这个Rest API(可能每天数百万),corePoolSize应该有多高?
  • 我应该采取什么行动来获得最佳的"参数?只能通过测试?
  • 哪些问题可能导致(每个参数的)高/低值?

提前谢谢

更新

我目前的价值是:

  • corePoolSize = 5
  • maxPoolSize = 20
  • queueCapacity = 100

1 个答案:

答案 0 :(得分:3)

  • corePoolSize 要保留在池中的线​​程数,即使它们处于空闲状态,除非设置了{@code allowCoreThreadTimeOut}
  • maximumPoolSize 池中允许的最大线程数

corePoolSize是您希望永远等待的线程数,即使没有人请求它们。 maximumPoolSize是您将启动的Rest API的最多线程数和因此并发请求数。

  • 您每秒有多少请求? (平均/每秒最大值)。
  • 请求需要多长时间?
  • 用户的最长可接受等待时间是多长?

corePoolSize >= requests per second * seconds per request

maximumPoolSize >= maximum requests per second * seconds per request

queueCapacity <= maximumPoolSize * maxWaitTime / timePerRequest(您应该对此进行监控,以便了解何时必须采取行动。)

您必须记住,Rest API或您自己的应用程序/服务器/带宽可能会对并发连接数施加一些限制,并且许多并发请求可能会增加每个请求的时间。

我宁愿保持corePoolSize低,keepAliveTime相当高。

你必须记住,每个线程只为并行HTTP请求增加了一些开销,应该有一个NIO变体,它可以在没有大量线程的情况下完成此任务。也许你可以试试Apache MINA