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 为什么tomcat的默认线程池大小如此之大?_Java_Multithreading_Tomcat - Fatal编程技术网

Java 为什么tomcat的默认线程池大小如此之大?

Java 为什么tomcat的默认线程池大小如此之大?,java,multithreading,tomcat,Java,Multithreading,Tomcat,我注意到默认的Tomcat7线程池大小似乎是200 但普通CPU似乎有16个内核 因此,只有16个线程可以并行执行 为什么tomcat使用这么多线程 多年来,许多单核计算机一直存在,能够以“伪并行”模式运行函数,也就是说,可能有16个线程以实并行模式运行,而其他线程以伪并行模式运行 有关更多信息,请查看以下内容: 为了回答您的问题,这些线程对处理请求很有用,其中一组线程将用于处理http请求,其他线程将用于调用应用程序逻辑。大多数真实的web应用程序使用数据库存储应用程序数据,因此往往是磁盘密集

我注意到默认的Tomcat7线程池大小似乎是200

但普通CPU似乎有16个内核

因此,只有16个线程可以并行执行

为什么tomcat使用这么多线程


多年来,许多单核计算机一直存在,能够以“伪并行”模式运行函数,也就是说,可能有16个线程以实并行模式运行,而其他线程以伪并行模式运行

有关更多信息,请查看以下内容:


为了回答您的问题,这些线程对处理请求很有用,其中一组线程将用于处理http请求,其他线程将用于调用应用程序逻辑。

大多数真实的web应用程序使用数据库存储应用程序数据,因此往往是磁盘密集型的。并发访问磁盘的线程过多可能会导致磁盘抖动。因此,在具有数据库的web应用程序上限制线程数量是有意义的。

在200个线程中,只有16个线程在16核机器上运行。典型web应用程序的逻辑是执行一些轻计算和重数据库查询。在200个线程中,只有少数线程正在进行计算,大多数线程正在等待数据库的响应。

您的计算机当前可能运行数十个进程/线程。我怀疑它有超过4个“真正的”执行流,但所有的东西都可以“同时运行”。这是由于在现代操作系统中发现的。我不知道内部结构,但这些线程可能只是免费的(除了脚印),其中的一个子集(理想情况下等于核心计数)正在执行。因此,200可能意味着他们需要大量的阻塞线程。传统的策略是分配多个线程,这些线程主要执行io工作,而cpu工作很少。如果你看这个图表,那么从美国向欧洲发送数据包需要大量的cpu周期。大部分时间都花在等待io到内存/磁盘/网络上,因此数百个线程可以共享内核。较新的服务器/框架为不同的工作使用不同的线程池,例如Play framework,它是非阻塞的。一些服务器/框架的线程池为每个核心使用一个thred,而不是io或阻塞。您的意思是http请求只需要很少的cpu使用量,所以tomcat可以使用更多的线程使cpu更“繁忙”?处理速度比网络传输快,特别是在互联网上,因此有大量的IO时间来使用cpu,否则将被浪费。