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

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

我希望我的问题有道理。

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

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

是的,如果你开火新线程,你必须非常小心; 你可以破坏事物,通常是一个坏主意。 如果必须执行需要很长时间的操作,请使用JMS异步处理它。 还要记住,并非所有影响Web应用程序数据的任务都必须从webapp调用。 每天扫描数据的任务可以作为一个单独的任务进入或运出tomcat – 即你可以使用石英调度程序编写一个工作,或者甚至编写一个单独的程序并将其设置为在cron中运行(be尽管如此,小心改变你webapp下的数据的工作。

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

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

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