java - 每个连接的线程如何使用线程池

标签 java multithreading tomcat

我正在使用 Spring Boot 和嵌入式 Tomcat(8),在 app.prop 文件中我们有两个选项:

server.tomcat.max-connections = 1000
server.tomcat.max-threads= 20

我从 tomcat 文档中了解到,第一个选项是服务器可以处理的最大连接数,第二个选项是 Tomcat 线程池中的最大线程数。后来我明白了,connections 和 requests 和我 tought 不是同一个词。之后我阅读了这个话题

What is the difference between thread per connection vs thread per request?

主题的要点是:

Thread per request will create a thread for each HTTP Request the server receives

Thread per connection will reuse the same HTTP Connection from multiple requests

reuse the same HTTP Connection 之后,我检查了 Http keep-alive。

概念:响应后,服务器和客户端能够保持打开连接。

但这怎么可能呢?我的意思是当我向服务器发送请求时,线程池中的一个线程将收到我的请求,然后向我发送一个请求,之后根据 Http keep-alive 我的连接没有关闭。它存储在哪里,当我发送另一个请求时会发生什么,同一个线程是否会处理我的请求?

最佳答案

这个问题是我3年前发的。当时我最不明白的是线程数量与连接数量有何不同。这对于初学者 Java 开发人员来说确实令人困惑,因为 Java 提供了用户级线程之上的抽象,并且不清楚在此上下文中什么是连接。

因此,对于基于 Unix 的系统,连接数是您的服务器可以同时打开的文件描述符的总数。假设连接数为 100,线程数为 10。这意味着当用户向服务器发送请求时,服务器为该请求创建一个文件描述符,如果 Tomcat 的所有线程都忙,那么该文件描述符将在一个线程中处理将可用。为了打开多个文件描述符,Tomcat (8+) 使用基于事件循环的 NIO 连接器。这里的重点是 tomcat 有一个(这个数字是可配置的)线程,它正在监听传入的请求,创建关联的文件描述符,当服务器完成处理时,使用文件描述符将此响应发送给客户端。

顺便说一句,这就是 Nodejs 的工作原理,如果您有兴趣,我写了一篇关于它的博文 https://strogiyotec.github.io/pages/posts/io.html

关于java - 每个连接的线程如何使用线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49841313/

相关文章:

java - 区分相同类型的异常

java - 在已经崩溃的系统上进行堆转储

java - 使用线程池同步银行java

java - 使用java获取tomcat的安装目录

c++ - 如何重新启动崩溃的线程

Java 线程 - 这是同步的正确使用吗

java - 试图在 Java 中制作一个模态 "Generating Report"对话框

java - Tomcat 适配器在开普勒中不可见

java - tomcat 中的关闭 Hook (必需)未运行

windows - Windows PC 中的 Sench Touch 设置,用于开发移动应用程序