Java Tomcat中的servlet、过滤器和线程

Java Tomcat中的servlet、过滤器和线程,java,tomcat,servlets,multithreading,Java,Tomcat,Servlets,Multithreading,在Tomcat容器中,与servlet和servlet本身关联的所有过滤器是否使用相同的线程?i、 doFilter()是否会与servlet的service()方法在同一线程中运行?提前感谢。是的,每个请求在单个线程中执行,包括所有筛选器和目标servlet。是的,每个请求在单个线程中执行,包括所有筛选器和目标servlet。是的,每个请求在单个servlet实例中执行。servlet容器接收每个请求并启动一个新线程,该线程包含HttpServletRequest和HttpServletRes

在Tomcat容器中,与servlet和servlet本身关联的所有过滤器是否使用相同的线程?i、 doFilter()是否会与servlet的service()方法在同一线程中运行?提前感谢。

是的,每个请求在单个线程中执行,包括所有筛选器和目标servlet。

是的,每个请求在单个线程中执行,包括所有筛选器和目标servlet。

是的,每个请求在单个servlet实例中执行。servlet容器接收每个请求并启动一个新线程,该线程包含HttpServletRequest和HttpServletResponse。此线程在servlet实例的服务方法中处理请求,并将在服务方法完成后立即销毁。

是的,每个请求都在单个servlet实例中执行。servlet容器接收每个请求并启动一个包含HttpServletRequest和HttpServletResponse的新线程。此线程处理servlet实例的服务方法中的请求,并将在服务方法完成后立即销毁。

我怀疑问题更多:我是否可以使用ThreadLocal对象在筛选器和servlet之间传递数据?在这种情况下,答案是绝对的。应用服务器自己这样做是为了跟踪安全性、事务、连接和其他请求信息

只需确保使用设置ThreadLocal的相同代码在finally块中清除ThreadLocal

正如其他人已经注意到的,servlet本身可以同步,也可以不同步,但这与线程状态的概念是正交的;i、 有多少线程针对对象foo执行,而我可以将状态放入线程并让对象foo看到它。第二个问题的答案总是肯定的

如果您使用了任何异步通信,则唯一的答案是“否”:

  • 已通过AsyncContext调度调用
  • 混入EJB并开始使用@Asynchronous或TimerService
这些涉及到应用服务器启动与原始请求线程无关的新线程,因此任何线程本地状态都不会随新线程一起移动。这也是为什么这些API不允许将调用方的安全性和事务上下文传播到调用的方法,因为调用方和方法位于不同的线程中


高级注意,InheritableThreadLocal通常不起作用,因为异步调用通常由服务器针对线程池执行,而不是创建调用者线程的子线程。

我怀疑问题更多:我可以使用ThreadLocal对象在筛选器和servlet之间传递数据吗?在这种情况下,答案是绝对的。应用服务器自己这样做是为了跟踪安全性、事务、连接和其他请求信息

只需确保使用设置ThreadLocal的相同代码在finally块中清除ThreadLocal

正如其他人已经注意到的,servlet本身可以同步,也可以不同步,但这与线程状态的概念是正交的;i、 有多少线程针对对象foo执行,而我可以将状态放入线程并让对象foo看到它。第二个问题的答案总是肯定的

如果您使用了任何异步通信,则唯一的答案是“否”:

  • 已通过AsyncContext调度调用
  • 混入EJB并开始使用@Asynchronous或TimerService
这些涉及到应用服务器启动与原始请求线程无关的新线程,因此任何线程本地状态都不会随新线程一起移动。这也是为什么这些API不允许将调用方的安全性和事务上下文传播到调用的方法,因为调用方和方法位于不同的线程中


高级注意,InheritableThreadLocal通常不起作用,因为异步调用通常由服务器针对线程池执行,而不是创建调用线程的子线程。

servlet容器管理servlet生命周期,不是开发人员。服务方法不是同步的-除非servlet实现SingleThreadModel接口,否则Tomcat会很高兴地并行运行线程为同一个servlet服务。请注意,
SingleThreadModel
自servlet 2.4 5年前以来就被弃用了。你不应该利用它。注意,Tomcat和大多数应用服务器不会像上面描述的那样为每个请求新建/销毁线程,而是对线程进行池化和重用。因此,请务必清除您可能设置的任何ThreadLocal状态,否则它将在稍后的另一个请求中返回。非常感谢您的回答。我一直试图在Tomcat文档中找到这些规范,但一直未能找到。有人知道如何找到它吗?servlet容器管理servlet生命周期,而不是开发人员。服务方法不是同步的,除非servlet实现SingleThreadModel接口,Tomcat很乐意并行运行线程为同一个servlet提供服务。请注意,
SingleThreadModel
自从5年前Servlet2.4以来就被弃用了。你不应该利用它。注意,Tomcat和大多数应用服务器不会像上面描述的那样为每个请求新建/销毁线程,而是对线程进行池化和重用。因此,请务必清除您可能设置的任何ThreadLocal状态,否则它将在稍后的另一个请求中返回。非常感谢您的回答。我一直试图在Tomcat文档中找到这些规范,但一直未能找到。有人知道怎么找到它吗?