在servlet中使用线程

时间:2012-01-25 12:08:30

标签: multithreading java-ee servlets

我很困惑,如果我们应该在servlet中创建自己的线程,因为它们具有线程机制 内部?如果是,我们怎样才能确定程序线程是否安全?如何在servlet中实现线程安全机制。

3 个答案:

答案 0 :(得分:2)

您提出了两个不同的问题:

  

如果我们应该在servlet中创建自己的线程,我感到很困惑   他们内部有线程机制吗?。

通常,您不应该在Java EE应用程序中启动线程。如果您需要单独的线程,请确保使用应用程序知道的调度程序服务,以便在应用程序关闭时它有机会关闭线程。 Quartz是大多数时候使用的。

  

如果是,我们怎样才能确定程序线程是否安全?如何   在servlet中实现线程安全机制。

Servlet就像任何其他Java类一样。查找有关线程安全的教程或阅读Java Concurrency in Practice

答案 1 :(得分:1)

我也有类似的担忧。

只有EJB规范不允许从应用程序创建线程。

可以从servlet启动一个线程 我做过很多次没有任何问题,但说实话,我并非百分百肯定:

  • 容器允许这样做,但违反了标准

  • 所有容器都允许。

但是在Tomcat中,我从来没有遇到过从servlet启动线程的问题。

您可以像在每个多线程程序中一样使其线程安全。

您将使用Java提供的所有可用构造进行同步。

答案 2 :(得分:1)

根据您在评论中所写的内容,我了解您有一组线程连续监视日志文件并在日志中找到有趣的内容时发送电子邮件。

第一个问题:为什么这是一个servlet?有网络gui吗?这是用来做什么的?

对于日志扫描部分,我会将其实现为servlet-container之外的单独进程。对于这个进程发现它需要发送到哪里的所有内容,我会向JMS队列添加一条消息。然后我将创建一个messagedriven bean来接收来自此队列的消息并将其作为电子邮件发送。 (这实际上是一个集成问题,将消息从JMS转换为电子邮件,您可能希望查看类似Mule的内容来解决此问题。)

至于如何将它与servlet集成,除了扫描日志之外,还取决于你的servlet做什么(我想它给用户提供了某种接口)

使用此设计,您可以选择重新编写将来生成日志的程序。第一个程序可以将有趣的消息直接放在JMS队列上,而不是让一个程序写入日志和另一个程序来解析日志。换句话说,您可以在将来更改架构的日志生成部分,而无需重新编写邮件发送部分。