我学到的关于Java EE开发的最初的事情之一就是不应该在Java EE容器内部创建自己的线程。但当我思考时,我并不知道原因。
你能清楚地解释为什么这是不被鼓励的吗?
我确定大多数企业应用程序需要一些异步作业,比如邮件守护进程、空闲会话、清理作业等。
所以,如果确实不应该创建线程,那么在需要时应该采用什么正确的方式呢?
我学到的关于Java EE开发的最初的事情之一就是不应该在Java EE容器内部创建自己的线程。但当我思考时,我并不知道原因。
你能清楚地解释为什么这是不被鼓励的吗?
我确定大多数企业应用程序需要一些异步作业,比如邮件守护进程、空闲会话、清理作业等。
所以,如果确实不应该创建线程,那么在需要时应该采用什么正确的方式呢?
并且企业Bean不能使用线程同步原语来同步多个实例的执行。
原因是EJB旨在在分布式环境中运行。EJB可能会从集群中的一台机器移动到另一台机器。线程(以及套接字和其他受限制的设施)是这种可移植性的重要障碍。企业Bean必须避免管理线程。企业Bean不能尝试启动、停止、暂停或恢复线程,也不能更改线程的优先级或名称,并且不能尝试管理线程组。
没有真正的理由不这样做。我在Web应用程序中使用 Quarz和 Spring,没有任何问题。同时并发框架java.util.concurrent
也可以使用。如果你实现自己的线程处理,请将线程设置为 deamon或者使用自己的deamon线程组,这样容器可以随时卸载您的Web应用程序。
但是要小心,bean作用域session和request在生成的线程中不起作用!此外,基于 ThreadLocal
的其他代码不能直接工作,您需要自己将值传输到生成的线程中。
您可以在部署描述符中指示容器始终启动某些内容。然后,这些内容可以执行您需要完成的任何维护任务。
请遵守规则。将来的某一天,您会为自己的决定感到高兴:)
我从未听说过这是不被鼓励的,除了它不容易正确实现这一事实。
这是相当低级别的编程,就像其他低级技术一样,你应该有一个很好的理由。大多数并发问题可以使用内置构造(如线程池)更有效地解决。
我发现的一个原因是,如果在EJB中生成一些线程,然后尝试让容器卸载或更新您的EJB,那么您将遇到问题。几乎总有另一种方法可以完成某件事,您不需要Thread,所以请拒绝。