Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java tomcat是否为每个用户创建线程?_Java_Jsp_Tomcat - Fatal编程技术网

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

Java tomcat是否为每个用户创建线程?,java,jsp,tomcat,Java,Jsp,Tomcat,我对网络开发相当陌生。如果这是一个非常基本的问题,我很抱歉。例如,我创建了一个web应用程序并将其部署到tomcat。现在,当多个用户访问web应用程序时,tomcat是否会为每个用户创建一个新线程?如果是这样的话,我还能在我的应用程序中创建线程,并期望它保持在tomcat创建的每个用户线程的本地吗?会话级数据是否跨线程保持同步 我希望我的问题有意义。每个请求都在不同的线程中处理。这不是“每个用户线程”。请求是来自客户端(web浏览器)和服务器的任何交互。因此,在浏览器中键入Url,调用ajax

我对网络开发相当陌生。如果这是一个非常基本的问题,我很抱歉。例如,我创建了一个web应用程序并将其部署到tomcat。现在,当多个用户访问web应用程序时,tomcat是否会为每个用户创建一个新线程?如果是这样的话,我还能在我的应用程序中创建线程,并期望它保持在tomcat创建的每个用户线程的本地吗?会话级数据是否跨线程保持同步

我希望我的问题有意义。

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

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

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

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

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


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

你可能也会觉得很有帮助。谢谢你详细的回答。那么,人们如何在web应用程序中执行并发任务呢?即使您可以从中获得性能,它通常也会被避免吗?并发是什么意思?如果一个请求启动一个需要很长时间的任务,您需要异步处理。这里的答案是使用JMS。其思想是将消息发送到队列或主题(发起请求结束),然后将bean(消息驱动bean)配置为监视队列或主题并使用其上的消息,并根据消息执行耗时的操作。你需要用谷歌搜索它来找出如何实现它,但这并不困难。