首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >tomcat会为每个用户创建一个线程吗?

tomcat会为每个用户创建一个线程吗?
EN

Stack Overflow用户
提问于 2010-08-04 09:38:58
回答 1查看 8.9K关注 0票数 22

我对web开发还是个新手。因此,如果这是一个非常基本的问题,我向您道歉。例如,我创建了一个web应用程序并将其部署到tomcat。现在,当多个用户访问web应用程序时,tomcat会为每个用户创建一个新线程吗?如果是这样的话,我还能在我的应用程序本身中创建线程,并期望它保持在tomcat创建的每个用户线程的本地吗?会话级数据在线程间保持同步吗?

我希望我的问题是有意义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-04 09:42:12

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

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

是的,如果你启动了新的线程,你必须非常小心;你可能会破坏一些东西,这通常是一个坏主意。如果您必须做一些需要很长时间的事情,那么使用JMS来异步处理它。还要记住,并不是所有影响web应用程序数据的任务都必须从webapp调用。每天扫描数据的任务可以作为单独的任务在tomcat内部或外部运行--也就是说,您可以使用quartz scheduler之类的工具编写一个作业,甚至可以编写一个单独的程序并将其设置为在cron中运行(不过,要注意更改webapp下的数据的作业)。

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

这也是启动你自己的线程是危险的原因之一。如果您启动自己的线程,当请求结束时,您可能会丢失绑定到初始线程的资源,这意味着如果您试图访问工作线程中的这些资源,它们将不可用。这种类型的bug很难找到或修复。

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

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3401992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档