【问题标题】:Threads in a Java Web ApplicationJava Web 应用程序中的线程
【发布时间】:2012-07-18 11:38:26
【问题描述】:

我需要创建一个线程来监听新文件、修改文件或删除文件的文件路径。我正在使用一个使用 Spring 3、Struts 2 和 Hibernate 3 的 Web 应用程序。如果我运行该项目,它会加载包含文本“Hello World”的 index.jsp。

问题在于,当我创建一个 java Thread() 来监听文件路径并将其分配给 index.jsp 时:

<action name="" method="runThread" class="TestThreadBean">
     <result>index.jsp</result>
</action>

然后“Hello World”文本永远不会出现,因为线程永远不会停止(这是正确的,它不应该停止)。我需要这个线程在后台运行,并且不干扰 Web 应用程序的其余部分。我不想只为这个线程创建一个单独的 Web 应用程序。另外,我不希望每次创建new Session 实例时都创建一个new Thread 实例,无论有多少 Session 实例处于活动状态,都应该只有一个 Thread 实例。

【问题讨论】:

  • 您实际上不需要做任何特别的事情来在 Tomcat 中运行线程。您可以像往常一样使用new ThreadExecutor 创建它们。这不符合 J2EE 规范,但事实是它可以工作。以符合规范的方式执行此操作并不简单,尤其是在实现 servlet 规范但不实现 J2EE 其余部分的容器中。
  • 您所说的“客户端”到底是什么意思?
  • 你需要一个调度机制来解决这个问题,尝试使用QuartzSimpleTrigger

标签: java multithreading tomcat


【解决方案1】:

基本上,人们会建议不要在容器管理的应用程序(如 Web 应用程序或企业 (EJB) 应用程序)中启动您自己的线程。

这是因为在容器环境中,包括线程在内的所有资源都应该由容器管理。但是恕我直言,如果您知道含义,以及我们自己的线程及其资源的生命周期,例如用事务包装这个线程等,那么我们可以使用标准方式(new Thread())创建一个线程,但这只是我的意见。

我建议您在做出决定之前先了解一下“容器管理的线程”。您可以参考commonJ 一次以获取容器线程池的句柄,但由于这不是标准或容器规范中未提及,它可能不适用于所有容器。这适用于:

【讨论】:

  • @ThreaT 在提供的 commonJ 链接中有一个。
  • @ThreaT 为什么服务器端线程应该知道客户端?
  • 所以也许你需要安排一个活动,而工作不是你要找的。​​span>
  • @ThrreaT 不删除此答案,因为您在发布答案后大幅更改了问题。您可以向答案的发布者请求更改答案,但一般来说,有答案之后彻底改变问题是一个非常非常糟糕的主意。
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
相关资源
最近更新 更多