为什么不鼓励在Java EE容器中生成线程?

Lio*_*orH 118 java multithreading java-ee

我学到的关于Java EE开发的第一件事就是我不应该在Java EE容器中生成我自己的线程.但是当我开始思考它时,我不知道原因.

你能清楚地解释为什么气馁吗?

我相信大多数企业应用程序都需要某种异步工作,如邮件守护进程,空闲会话,清理工作等.

因此,如果确实不应该生成线程,那么在需要时执行它的正确方法是什么?

Rob*_*bin 84

不鼓励使用,因为服务器要管理并可能监视环境中的所有资源.此外,正在使用线程的大部分上下文通常附加到执行线程本身.如果您只是启动自己的线程(我相信某些服务器甚至不允许),它就无法访问其他资源.这意味着,您无法获取InitialContext并执行JNDI查找以访问其他系统资源,例如JMS连接工厂和数据源.

有很多方法可以"正确"执行此操作,但这取决于所使用的平台.

commonj WorkManager对于WebSphere和WebLogic以及其他人来说很常见

更多信息在这里

和这里

也有些重复这个从今天上午

更新:请注意,这个问题和答案与2009年的Java EE状态有关,从那时起情况有所改善!

  • 现在有一种标准的,正确的方法来使用核心Java EE API创建线程.通过使用Concurrency Utils,您可以确保创建新线程并由容器管理,从而确保所有EE服务都可用.示例[这里](http://blog.chris-ritchie.com/2013/09/simple-concurrency-example-with-wildfly.html)和[here](http://blog.chris-ritchie.com/十分之二千零十三/管理的线程工厂示例合wildfly.html) (6认同)

Dan*_*yer 34

对于EJB,它不仅是气馁的,而且明确禁止规范:

企业bean不得使用线程同步原语来同步多个实例的执行.

企业bean不得尝试管理线程.企业bean不得尝试启动,停止,暂停或恢复线程,或更改线程的优先级或名称.企业bean不得尝试管理线程组.

原因是EJB旨在在分布式环境中运行.EJB可能会从群集中的一台计算机移动到另一台计算机.线程(以及套接字和其他受限设施)是这种可移植性的重大障碍.

  • Java EE7 Concurrency Utils提供了在企业环境中创建线程的正确方法.示例[这里](http://blog.chris-ritchie.com/2013/09/simple-concurrency-example-with-wildfly.html)和[here](http://blog.chris-ritchie.com/十分之二千零十三/管理的线程工厂示例合wildfly.html) (3认同)

kgi*_*kis 13

您不应该生成自己的线程的原因是容器不会管理这些线程.容器会处理很多新手开发人员难以想象的事情.例如,容器执行线程池,群集,崩溃恢复等操作.当你开始一个线程时,你可能会失去一些.此外,容器还允许您重新启动应用程序,而不会影响它运行的JVM.如果容器的控件中有线程,这怎么可能呢?

这就是引入J2EE 1.4计时器服务的原因.请参见文章的详细信息.

  • JSR 236添加了功能来支持Java EE 7及更高版本中的生成线程。请参阅[克里斯·里奇(Chris Ritchie)的同级答案](http://stackoverflow.com/a/19404453/642706)。 (2认同)

Chr*_*hie 8

Java EE的并发实用程序

现在有一种使用核心Java EE API创建线程的标准且正确的方法:

通过使用Concurrency Utils,您可以确保创建新线程并由容器管理,从而确保所有EE服务都可用.

这里的例子