【问题标题】:Tomcat : Is there a standard way to create a thread per request?Tomcat:是否有标准的方法来为每个请求创建一个线程?
【发布时间】:2015-03-28 09:45:22
【问题描述】:

我应该在 servlet 实现中编写线程敏感逻辑。 (Windows 上的线程级模拟)

在此实现中,每个请求都应由新的 Java(= OS Native)线程处理,并且线程应在处理完请求后释放。

我的问题是,有没有标准的方法来阻止 tomcat 重用线程?

更新

最后我决定编写 org.apache.catalina.Executor 接口的自定义实现。它将是预先创建的线程池,但使用的线程只是被丢弃,而不是返回池。

【问题讨论】:

  • 我不完全明白你想做什么;线程池(如连接池)的存在是为了提高效率:您是否担心信息从一个线程泄漏到另一个线程?
  • 是的。我担心因为线程模拟而导致信息泄露。一些操作系统支持运行线程不同的权限,我使用它。我是我的实现。每个 IO 操作和其他经过审核的本机操作都在使用 underuser 的权限。 ACL 和其他权限将在 Tomcat 执行用户(root 或 www)下评估,但远程用户上下文。

标签: java spring tomcat


【解决方案1】:

默认情况下,servlet 架构中的每个请求都被服务器视为一个新的Thread,因此您无需维护request。默认情况下,这将由任何 Web 服务器处理。您不能更改不重用线程here's the explaination的配置。

【讨论】:

  • 它是默认行为还是标准行为?在我在 Tomcat 8 上运行的用于测试的简单 servlet 中。启用了执行程序池并重用了线程。
  • 不一定:正如您链接的文档所说,Tomcat 使用线程池,它是一组线程,每个线程服务一个请求。但是线程并不是每次都重新生成(虽然它们可能会不时重新生成,即防止 ThreadLocal 的内存泄漏 - 找不到参考 ATM)
  • @user3188838 其默认行为,您只能更改文档中链接的允许参数。如果您认为它对您有帮助,也可以将此答案标记为已接受:)
  • 对不起。我知道一个线程不会同时处理多个请求。但是我从不使用一个线程来处理多个请求。因为使用的线程的本地上下文可能会被破坏性地改变(例如线程安全特权等)。在这种情况下,某种线程上下文更改是单向的。如果我限制线程权限,则无法释放它。将受限线程返回到线程池并重用会导致意想不到的结果。我寻求这个问题的 ServletContainer 级别的解决方案。或者我应该将我所有的代码都包装在 servlet 方法中的一次性 Executor 中。不漂亮。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2011-05-15
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多