Java Web应用程序中的线程

Java Web应用程序中的线程,java,multithreading,tomcat,Java,Multithreading,Tomcat,我需要创建一个线程来侦听新文件、修改文件或删除文件的文件路径。我正在使用一个使用Spring3、Struts2和Hibernate3的web应用程序。如果我运行该项目,它将加载index.jsp,其中包含文本“Hello World” 问题是,当我创建一个javaThread()侦听文件路径并将其分配给index.jsp时: <action name="" method="runThread" class="TestThreadBean"> <result>in

我需要创建一个线程来侦听新文件、修改文件或删除文件的文件路径。我正在使用一个使用Spring3、Struts2和Hibernate3的web应用程序。如果我运行该项目,它将加载index.jsp,其中包含文本“Hello World”

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

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

index.jsp

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

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

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

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


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

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

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


在Tomcat中运行线程实际上不需要做任何特殊的事情。您可以像往常一样创建它们,使用
新线程
执行器
。这不符合J2EE规范,但事实是它可以工作。以符合规范的方式进行这项工作并不简单,特别是在实现servlet规范而不是J2EE其余部分的容器中。您所说的“客户端”到底是什么意思?您需要一个调度机制来实现这一点,尝试使用
Quartz
SimpleTrigger
。实际上,在Tomcat中运行线程不需要做任何特殊的事情。您可以像往常一样创建它们,使用
新线程
执行器
。这不符合J2EE规范,但事实是它可以工作。以符合规范的方式进行这项工作并不简单,特别是在实现servlet规范而不是J2EE其余部分的容器中。您所说的“客户端”到底是什么意思?您需要一个调度机制来实现这一点,尝试使用
Quartz
SimpleTrigger
@ThreaT在提供的commonJ链接中有一个@ThreaT@ThreaT为什么服务器端线程应该知道客户端?因此可能需要安排一个活动,你要找的不是作品。让我们@ThreaT不要删除这个答案,因为在答案发布后,你对这个问题做了实质性的修改。您可以从答案海报上请求更改答案,但一般来说,在有答案后从根本上更改问题是一个非常非常糟糕的主意。@提供的commonJ链接中有一个威胁。@威胁为什么服务器端线程应该知道客户端?因此,您可能需要安排一个活动,你要找的不是作品。让我们@ThreaT不要删除这个答案,因为在答案发布后,你对这个问题做了实质性的修改。你可以从答案的海报上要求改变答案,但一般来说,在有答案后从根本上改变问题是一个非常非常糟糕的主意。