关于Java EE开发的第一件事是,我不应该在Java EE容器中生成自己的线程。但是当我考虑它时,我不知道原因。
您能清楚地解释为什么不鼓励这样做吗?
我确信大多数企业应用程序都需要某种异步作业,例如邮件守护程序,空闲会话,清理作业等。
因此,如果确实不应该产生线程,那么在需要时正确的方法是什么?
关于Java EE开发的第一件事是,我不应该在Java EE容器中生成自己的线程。但是当我考虑它时,我不知道原因。
您能清楚地解释为什么不鼓励这样做吗?
我确信大多数企业应用程序都需要某种异步作业,例如邮件守护程序,空闲会话,清理作业等。
因此,如果确实不应该产生线程,那么在需要时正确的方法是什么?
Answers:
不建议这样做,因为环境中的所有资源都应由服务器进行管理,并可能由服务器进行监视。同样,使用线程的许多上下文通常都附加到执行线程本身。如果仅启动自己的线程(我相信某些服务器甚至不允许),则该线程将无法访问其他资源。这意味着您无法获得InitialContext,也无法执行JNDI查找来访问其他系统资源,例如JMS连接工厂和数据源。
有一些方法可以“正确”地执行此操作,但这取决于所使用的平台。
commonj WorkManager对于WebSphere和WebLogic以及其他工具都是通用的
也有些重复这个从今天上午
更新:请注意,此问题和答案与2009年Java EE的状态有关,此后情况有所改善!
您不应该产生自己的线程的原因是,这些线程不会由容器管理。容器处理了许多新手开发人员难以想象的事情。例如,线程池,群集,崩溃恢复之类的事情由容器执行。启动线程时,您可能会丢失其中一些线程。此外,容器还使您可以重新启动应用程序,而不会影响其运行的JVM。如果有线程超出了容器的控制范围,那怎么可能?
这就是从J2EE 1.4计时器服务引入的原因。请参见本文章的详细信息。
您总是可以告诉容器在您的部署描述符中启动东西。然后,它们可以执行您需要执行的任何维护任务。
遵守规则。有一天你会很高兴的:)
没有真正的理由不这样做。我在Webapp中将Quarz和Spring一起使用时没有问题。也java.util.concurrent
可以使用并发框架。如果您实现自己的线程处理,请将theads设置为deamon或为其使用一个自己的deamon线程组,以便容器可以随时卸载您的webapp。
但是要小心,bean作用域会话和请求在产生的线程中不起作用!同样,其他代码ThreadLocal
无法立即使用,您需要自行将值传输到生成的线程。