tomcat 是否为每个用户创建一个线程?

2022-09-01 22:49:04

我对Web开发相当陌生。因此,如果这是一个非常基本的问题,我很抱歉。例如,我创建了一个Web应用程序并将其部署到tomcat。现在,当多个用户访问 Web 应用程序时,tomcat 是否会为每个用户创建一个新线程?如果是这种情况,那么我是否仍然可以在我的应用程序本身中创建线程,并期望它保持对tomcat创建的每个用户线程的本地?会话级数据是否在线程之间保持同步?

我希望我的问题有意义。


答案 1

每个请求都在不同的线程中处理。这不是“每个用户的线程”。请求是来自客户端(Web 浏览器)和服务器的任何交互。因此,在浏览器中键入 Url,调用 ajax 请求,每个请求都在单独的线程中处理。

用户在“登录”期间获得的状态(它不一定是登录本身;更好的说法是“一个用户的一组相关请求”)可以方便地存储在会话中。您可以使用会话来存储适用于用户的任何数据,但应注意不要存储太多数据,因为它会占用内存。会话管理需要一定程度的技能。

是的,如果您触发新线程,则必须非常小心;你可以打破一些东西,通常这是一个坏主意。如果您必须执行需要很长时间的事情,请使用 JMS 以异步方式处理任何操作。另请记住,并非所有影响 Web 应用程序数据的任务都必须从 web 应用调用。每天扫描数据的任务可以作为一个单独的任务在tomcat中或从tomcat中运行 - 也就是说,您可以使用像quartz调度程序之类的东西编写作业,甚至可以编写一个单独的程序并将其设置为在cron中运行(小心从webapp下更改数据的工作, 虽然)。

如果您使用的是Spring和Hibernate等最佳技术,它们通常会将程序员需要的对象(或可以由应用程序开发人员配置)绑定到每个线程(使用java的ThreadLocal)。

这也是启动自己的线程很危险的原因之一。如果启动自己的线程,则可能会丢失在请求结束时绑定到初始线程的资源,这意味着,如果您尝试访问工作线程中的这些资源,它们将不可用。这种类型的错误可能是一个痛苦的屁股找到/修复。

编辑 - 正如Stephen C在另一个答案的评论中指出的那样,重要的是要注意,通常Tomcat(和其他容器)会维护一个线程池以供使用。这意味着不一定为每个请求创建一个新线程。这意味着每个请求都在单独的线程中运行,该线程可能会或可能不会创建或重用。


答案 2