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

时间:2018-04-15 11:18:20

标签: java multithreading tomcat

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

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

从tomcat docs我已经读过,第一个选项是服务器可以支持的最大连接数,第二个选项是线程池中的最大线程数。在我了解之后,连接和请求与我想的不一样。之后我读了这个主题

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我的连接未关闭。在哪里存储,当我发送另一个请求时会发生什么,同一个线程是否会处理我的请求?

2 个答案:

答案 0 :(得分:0)

  

存储在哪里,

这是一个实现细节 - 对于在Tomcat之上开发应用程序并不重要。您必须为此查找Tomcat的源代码,但我认为这完全没必要。除非你想进入tomcat开发,否则它不会教你任何东西。仅适用于应用:忽略它。

  

当我发送另一个请求时会发生什么,

它将被处理。周期。

  

同一个线程处理我的请求吗?

不。或者:随机是的。任何当前可以自由处理请求的线程都将用于处理此请求。

您的问题暗示了一些危险的期望:除了requestresponse中封装的当前状态的所有之外,您不得假设请求处理中的任何内容。被处理到servlet中的对象。没有其他假设 - 实际上,任何其他假设(例如关于线程,servlet的成员变量)通常是错误的。

容器(tomcat)可以很好地将应用程序与那些低级别的细节隔离开来。不要去那里弄乱它。除了在requestresponse对象中找到的内容之外,您不能假设处理一个请求与下一个请求之间存在任何一致性。

答案 1 :(得分:0)

所以这个问题是我3年前发布的。我当时不了解的主要内容是线程数量与连接数量有何不同。对于Java初学者来说,这确实令人困惑,因为Java在用户级别线程之上提供了抽象,并且不清楚在这种情况下什么是连接。

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

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