java-Servlet不应启动线程,原因是在群集时可能会出现问题…什么问题?

我知道我们不应该在servlet中启动线程,因为线程应该由容器管理.如果容器被告知要关闭,如果有线程不知道它在周围闲逛,它将不会关闭.我通过使其成为守护线程来解决这个问题.

但是,除了上述“无法关闭”情况以外,还有什么其他原因导致不允许servlet启动线程.我已经看到一些提及,如果环境是集群的,将会引起问题.但是,对于可能发生的不良情况,没有任何实际的了解.

编辑:
目前,这是在servlet中完成的,我很难说服该代码的作者,这不是一个好主意.关于必须理解复杂性的争论不会奏效.
我正在寻找一种特定的具体情况,当可能发生不好的事情时,不打算这样做

在我的情况下:所讨论的servlet是启动n个线程,而这是设计使然发生在集群上的每个vm中.
没有交易要求

解决方法:

official FAQ开始:

Why is thread creation and management
disallowed?

The EJB specification assigns to the
EJB container the responsibility for
managing threads. Allowing enterprise
bean instances to create and manage
threads would interfere with the
container’s ability to control its
components’ lifecycle. Thread
management is not a business function,
it is an implementation detail, and is
typically complicated and
platform-specific. Letting the
container manage threads relieves the
enterprise bean developer of dealing
with threading issues. Multithreaded
applications are still possible, but
control of multithreading is located
in the container, not in the
enterprise bean.

就是说,如果不考虑启动和关闭问题,那么从某种意义上说,线程是实现细节,并且多线程被认为是可伸缩性问题,这在某种意义上是“哲学”问题,应对此进行管理通过应用程序.服务器.

例如,大多数应用程序.服务器允许集成商定义池并配置线程数等.生成线程本身的应用程序会逃脱此配置,并且在可伸缩性计划中无法很好地配合.

另外,如果您想在集群环境中使用单个后台线程,那么它将变得很棘手.

最后是应用程序.服务器控制交易.如果您自己生成线程,则必须小心了解可以安全使用或不能安全使用的所有详细信息(例如,从池中获得连接)以及必要时如何使用UserTransaction.这个想法是,如果您使用应用程序,则不必担心这样的细节.服务器,但是如果您自己开始处理线程,则需要这样做.

但是,我已经看到Web应用程序从ServletContextListener生成了一个后台线程,并且猜测,即使该应用程序部署在多个节点上,也可以.您只需要了解运行多个JVM的含义,并确保正确支持即可.

上一篇:MySQL:Can't connect to MySQL server on 'localhost'(10061)


下一篇:Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件