Tomcat中的Servlet,过滤器和线程

时间:2010-08-02 08:45:27

标签: java tomcat servlets multithreading

在Tomcat容器中,是否所有与servlet关联的过滤器和servlet本身都使用相同的线程?那么,doFilter()是否可以在与servlet的service()方法相同的线程中运行?提前谢谢。

3 个答案:

答案 0 :(得分:5)

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

请确保使用设置ThreadLocal的相同代码清除finally块中的ThreadLocal。

正如其他人已经指出的那样,servlet本身可能同步也可能不同步,但这与线程状态的概念正交;即对对象foo执行多少个线程?我可以在线程中放置状态并让对象foo看到它。第二个问题的答案总是肯定的。

唯一的答案是“否”是你使用了任何异步通信:

  • 通过AsyncContext
  • 调度呼叫
  • 在EJB中混合并开始使用@Asynchronous或TimerService

这些涉及app服务器启动与原始请求线程无关的新线程,因此任何ThreadLocal状态都不会与新线程一起传播。这也是为什么这些API不允许调用者的安全性和事务上下文传播到调用的方法,因为调用者和方法在不同的线程中。

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

答案 1 :(得分:4)

是的,每个请求都在一个线程中执行,包括所有过滤器和目标servlet。

答案 2 :(得分:-1)

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