java - Tomcat 中的 Servlet、过滤器和线程

标签 java tomcat servlets multithreading

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

最佳答案

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

只需确保在设置 ThreadLocal 的相同代码中的 finally block 中清除 ThreadLocal。

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

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

  • 通过 AsyncContext 调度调用
  • 混入 EJB 并开始使用 @Asynchronous 或 TimerService

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

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

关于java - Tomcat 中的 Servlet、过滤器和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386254/

相关文章:

java.lang.ClassCastException : [Ljava. lang.Object;不能转换为 com.sakhnin.classes.MonthlySummary

java - 授予对一个 GAE servlet 的公共(public)访问权限,但对所有其他资源使用身份验证?

java - 在 Tomcat servlet 中创建套接字 - 权限被拒绝(连接失败)

java - 不忽略一个值?

java - 无限for循环

Tomcat 7 : Filter access log

java - 为什么 Java toString() 在间接循环上无限循环?

java - 服务器 Tomcat v7.0 服务器在 localhost 无法在 90 秒内启动

java - 如何将API Sesame 与Tomcat 服务器结合成Java 动态Web 项目?

java - 为什么只有部分文件和文件夹没有被删除?