如何在Java EE中启动多个线程?

4

我需要扩展对Tomcat的调用,有人建议在内部启动线程。如果有人需要这样做,他们会想出什么解决方案?


你真的需要添加更多细节,以便了解你试图实现什么。长时间运行的任务、并发、容量等。 - Robin
我经常想到这个问题——从应用服务器启动线程是否“可行”。我没有找到权威的答案,所以希望你的问题很快能成为这个主题的好文档。 - Limbic System
6个回答

5
一般不建议在应用服务器中创建自己的线程,因为服务器应该管理线程以提高可伸缩性。如果容器对线程上下文中可用的内容(如安全信息(例如,已验证的Subject))做出假设,则还可能遇到问题。如果您从该线程生成一个线程,然后使用容器中未知的服务器资源,通常会发生这种情况。

请检查是否有一种方法可以从Tomcat获取容器管理的线程。WebLogic和WebSphere支持commonj.WorkManager,它允许您在容器管理的线程上调度工作。Spring也可以使用commonj,但我不确定Tomcat上是否支持此功能。


1

你的问题有些含糊不清。Tomcat本身已经使用线程池来处理HTTP请求。你可以通过Tomcat配置增加线程数 - 可以在Tomcat wiki上寻找相关信息。

如果你想在代码中启动线程,我建议阅读Java 5引入的java.util.concurrent API。还应该阅读《Java并发编程实战》,它是关于这个主题的权威著作


1
你试图用线程解决什么问题?
如果有长时间运行的任务,应该使用 JMS + 完整的 Java EE 容器。
如果你试图处理过多的负载,可以考虑使用两个 tomcat 实例,但是如果你正在使用 http 会话,你需要研究会话复制。
如果你被迫使用 Tomcat,请考虑在 java.util.concurrency 中使用 Executors 框架。

1

除非你有非常特定的需求,否则不应该从Web应用程序中启动线程。如果没有更多关于你的问题的细节,很难确定这是否是解决问题的正确方法。

你可能想看一下Quartz,它是一个完整的开源作业调度系统,可以与几乎任何J2EE或J2SE应用程序集成或并行使用。


0

正如其他人所问,您应该更详细地说明您想要完成的目标。

否则,Tomcat 使用线程池。增加线程池中的线程数。使用更新版本的 Tomcat-- 6.x。使用 Java 6.0_10。如果需要,可以使用分析器调整应用程序并调整 JVM 设置(如果需要)。


0

J2EE 对于管理多线程的抽象是JCA。特别要看看 WorkManager 和 Work 类。还可以参考this article。Spring 也提供了基于 JCA 的工作管理器抽象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接