Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java threadpoolexcecutor的线程池中很少有线程正在执行任务_Java_Multithreading - Fatal编程技术网

Java threadpoolexcecutor的线程池中很少有线程正在执行任务

Java threadpoolexcecutor的线程池中很少有线程正在执行任务,java,multithreading,Java,Multithreading,我正在使用ThreadPoolExecutor和corePoolSize=maxPoolSize=queueSize=15 每个传入请求生成7个任务,将使用此线程池执行 即使每个单独的任务在计划时所需的时间少于3秒,但整个请求所需的时间要长得多 我怀疑系统缺少正在排队的线程和任务 我为每个传入的请求记录了以下信息 getActiveCount() getLargestPoolSize() getPoolSize() getQueue().size() 我注意到系统没有缺少线程 getPoolS

我正在使用
ThreadPoolExecutor
corePoolSize
=
maxPoolSize
=
queueSize
=
15

每个传入请求生成7个任务,将使用此线程池执行

即使每个单独的任务在计划时所需的时间少于3秒,但整个请求所需的时间要长得多

我怀疑系统缺少正在排队的线程和任务

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

getActiveCount()
getLargestPoolSize()
getPoolSize()
getQueue().size()
我注意到系统没有缺少线程

getPoolSize
getLargestPoolSize
值始终为15-这与预期一致

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

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

为什么池中的其余线程不能工作


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

我不太了解Java的线程池,但一般来说,您只会创建尽可能多的线程,只要您的机器有可用的内核(或硬件线程)。如果您在双核计算机上运行,那么2个活动线程是一个合理的值。

正如@Thomas所建议的,该池正在根据需要创建线程,因此如果您一次只给池1-2个任务,它将只有1-2个活动线程。如果您想让它更忙,您需要一次向它提供更多的任务。

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

这根本不是真的。例如,如果您使用的外部服务速度较慢,例如rest API,那么您可以轻松地支持比可用内核数量多得多的线程。是的,我的7个任务实际上是7个外部服务调用。所以我猜当线程在i/O上被阻塞时(在我的例子中是网络),它应该处理更多的线程。但似乎并非如此。每个传入请求都会在一个紧密循环中添加7个任务。除非您的任务非常重要,否则可能不会创建新线程。如果在这个紧循环之后立即获取active(),您会看到什么。