threadpoolexcecutor的线程池中很少有线程主动执行任务

时间:2011-04-23 15:26:41

标签: java multithreading

我使用的ThreadPoolExecutor corePoolSize = maxPoolSize = queueSize = 15

每个传入的请求都会生成7个任务,这些任务将通过此线程池执行。

即使每个单独的任务在安排时间不到3秒,整个请求也需要更长的时间。

我怀疑系统没有排队的线程和任务。

我为每个传入的请求记录了以下信息。

getActiveCount()
getLargestPoolSize()
getPoolSize()
getQueue().size()

我注意到系统没有缺少线程。

getPoolSizegetLargestPoolSize值始终为15 - 这与预期一致。

getQueue().size()始终为0 - 因此没有任务排队。

getActiveCount()值始终在1-2之间。

为什么池中的其余线程没有工作?

是“getActiveCount() - 返回正在执行任务的大致线程数。”使用正确的API?

3 个答案:

答案 0 :(得分:2)

正如@Thomas建议的那样,池正在根据需要创建线程,所以如果你只给1-2个池执行任务,那么它只有1-2个线程处于活动状态。如果您希望它更忙,您需要立即向其提供更多任务。

答案 1 :(得分:1)

我不太了解Java的线程池,但通常只会创建尽可能多的线程,因为您的机器具有可用的内核(或硬件线程)。如果您在双核机器上运行2活动线程是一个合理的值。

答案 2 :(得分:0)

您是否曾尝试在eclipse中以调试模式运行此操作?它通常显示分配的所有线程及其状态。 我怀疑在你的情况下会发生以下情况:你有线程池和线程池已分配线程数来处理你提交给它的任务。但是一旦线程池中的任何特定线程完成了提交到线程池的任务,它就不会终止。相反,它将其状态切换为BLOCKED或WAITING(我不记得确定其中哪一个)并等待下一个任务传递到此特定线程进行处理。