2012-07-18 129 views
1

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

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

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

然后“Hello World”文本未出现过因为线程不永远停止(这是对的,它不应该停止)。我需要此线程在后台运行,而不会干扰其他Web应用程序。虽然我不想为此线程创建单独的Web应用程序。另外,我不希望每创建一个new会话实例时都创建一个new线程实例,不管有多少个会话实例处于活动状态,应只有一个线程实例。

+0

请更具体 – NiranjanBhat 2012-07-18 11:41:16

+2

你其实并不需要做什么特别的Tomcat中运行的线程。你可以像往常一样使用'new Thread'或'Executor'来创建它们。这不符合J2EE规范,但事实是它可以工作。以符合规范的方式执行此操作并不容易,特别是在实现servlet规范的容器中,而不是J2EE的其余部分。 – 2012-07-18 11:42:58

+0

“客户端”究竟是什么意思? – 2012-07-18 14:43:40

回答

7

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

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

我建议你在做出决定之前先通过'容器管理线程'。您可以参考commonJ一次获取Container的线程池的句柄,但由于这不是标准或未在容器规范中提及,因此它可能不适用于所有容器。这将为工作:

+0

@ ThreaT提供commonJ链接中的一个。 – Carlo 2012-07-18 12:14:45

+0

@ThreaT为什么服务器端线程应该知道客户端? – Carlo 2012-07-18 12:21:29

+0

所以,也许你需要安排一项活动,而一项工作并不是你要找的。 – Carlo 2012-07-18 12:24:39