为什么不鼓励在 Java EE 容器中生成线程?
2022-08-31 08:48:13
关于 Java EE 开发,我学到的第一件事就是,我不应该在 Java EE 容器中生成自己的线程。但当我想到它时,我不知道原因。
你能清楚地解释为什么它不鼓励吗?
我相信大多数企业应用程序都需要某种异步作业,如邮件守护程序,空闲会话,清理作业等。
那么,如果确实不应该生成线程,那么在需要时执行此操作的正确方法是什么?
关于 Java EE 开发,我学到的第一件事就是,我不应该在 Java EE 容器中生成自己的线程。但当我想到它时,我不知道原因。
你能清楚地解释为什么它不鼓励吗?
我相信大多数企业应用程序都需要某种异步作业,如邮件守护程序,空闲会话,清理作业等。
那么,如果确实不应该生成线程,那么在需要时执行此操作的正确方法是什么?
不建议这样做,因为环境中的所有资源都旨在由服务器进行管理并可能对其进行监视。此外,使用线程的大部分上下文通常附加到执行线程本身。如果您只是启动自己的线程(我相信有些服务器甚至不允许),则无法访问其他资源。这意味着您无法获得 InitialContext 并执行 JNDI 查找来访问其他系统资源,如 JMS 连接工厂和数据源。
有一些方法可以“正确”地执行此操作,但它取决于所使用的平台。
commonj WorkManager在WebSphere和WebLogic以及其他方面很常见。
也有点重复今天早上的这个
更新:请注意,这个问题和答案与2009年Java EE的状态有关,从那时起情况有所改善!
对于 EJB,它不仅不鼓励,而且被规范明确禁止:
企业 Bean 不得使用线程同步原语来同步多个实例的执行。
和
企业 Bean 不得尝试管理线程。企业 Bean 不得尝试启动、停止、挂起或恢复线程,也不得更改线程的优先级或名称。企业 Bean 不得尝试管理线程组。
原因是 EJB 应该在分布式环境中运行。EJB 可以从集群中的一台机器移动到另一台机器。线程(以及套接字和其他受限设施)是这种可移植性的重大障碍。