我使用的ThreadPoolExecutor
corePoolSize
= maxPoolSize
= queueSize
= 15
每个传入的请求都会生成7个任务,这些任务将通过此线程池执行。
即使每个单独的任务在安排时间不到3秒,整个请求也需要更长的时间。
我怀疑系统没有排队的线程和任务。
我为每个传入的请求记录了以下信息。
getActiveCount()
getLargestPoolSize()
getPoolSize()
getQueue().size()
我注意到系统没有缺少线程。
getPoolSize
和getLargestPoolSize
值始终为15 - 这与预期一致。
getQueue().size()
始终为0 - 因此没有任务排队。
getActiveCount()
值始终在1-2之间。
为什么池中的其余线程没有工作?
是“getActiveCount()
- 返回正在执行任务的大致线程数。”使用正确的API?
答案 0 :(得分:2)
正如@Thomas建议的那样,池正在根据需要创建线程,所以如果你只给1-2个池执行任务,那么它只有1-2个线程处于活动状态。如果您希望它更忙,您需要立即向其提供更多任务。
答案 1 :(得分:1)
我不太了解Java的线程池,但通常只会创建尽可能多的线程,因为您的机器具有可用的内核(或硬件线程)。如果您在双核机器上运行2活动线程是一个合理的值。
答案 2 :(得分:0)
您是否曾尝试在eclipse中以调试模式运行此操作?它通常显示分配的所有线程及其状态。 我怀疑在你的情况下会发生以下情况:你有线程池和线程池已分配线程数来处理你提交给它的任务。但是一旦线程池中的任何特定线程完成了提交到线程池的任务,它就不会终止。相反,它将其状态切换为BLOCKED或WAITING(我不记得确定其中哪一个)并等待下一个任务传递到此特定线程进行处理。