【发布时间】:2013-06-12 12:46:13
【问题描述】:
我对 Java 还很陌生,我的经验仅限于在 Web 容器(在我的例子中是 Jboss)上运行的基于 Web 的应用程序。
我是否正确地说,对于 Web 应用程序,Web 容器负责多线程?如果是这样,我可以在基于 Web 的应用程序中引入新的线程吗?这样做有什么好处吗?在什么情况下需要这样做?
谢谢
【问题讨论】:
标签: java multithreading web-applications
我对 Java 还很陌生,我的经验仅限于在 Web 容器(在我的例子中是 Jboss)上运行的基于 Web 的应用程序。
我是否正确地说,对于 Web 应用程序,Web 容器负责多线程?如果是这样,我可以在基于 Web 的应用程序中引入新的线程吗?这样做有什么好处吗?在什么情况下需要这样做?
谢谢
【问题讨论】:
标签: java multithreading web-applications
由于容器实现了“多线程 servlet 模型”,因此大多数 Web 容器都使它们运行多线程应用程序。因此,您的应用程序(您的 servlet 的代码)已经由多个线程运行,因此,它必须是线程安全的(在访问共享数据时必须使用适当的同步,例如您的 servlet 类的实例字段等)
在您的网络应用程序中启动新线程是完全合法的。例如,您可能需要它来启动一些长时间运行的任务(在数据库中注册用户,以发送电子邮件结束,或计算PI 直到小数点后 100000 位)并在此之后立即关闭用户 HTTP 请求,使用户的浏览器完成加载给定的 URL。
【讨论】:
Web 应用程序服务器倾向于为每个请求创建一个新线程。因此,如果两个用户同时填写并提交表单,您可以放心,这两个请求都是使用单独的线程发送到服务器的。访问任何特定页面的并发用户数量实际上将决定页面可以处理的负载。
就创建新线程而言。您当然可以在应用程序内部使用传统的 java 方法创建新线程来创建新线程。
通常您希望创建一个新线程以防您想要执行异步任务并且不希望用户等待输出。假设在数据库中插入与用户无关的大数据通常会写入线程。
此外,如果您打算在后台执行长时间运行的任务,代码通常编写在线程内。
有时,要求访问页面和请求某些内容的用户也需要位于服务器端的线程中。例如。试图访问打印机。在这种情况下,您还需要确保您的代码是在线程中编写的,并且您已经正确同步了方法。
【讨论】:
我是否正确地说,对于 Web 应用程序,Web 容器负责处理多线程?
大多数服务器都是多线程的,可以同时处理多个请求。
我可以在基于 Web 的应用程序中引入新的线程吗?
是的你可以。这取决于您的要求。
这样做有什么好处吗?在什么情况下需要这样做?
如果有一个耗时的工作可以异步完成,那么使用多个线程。
e.g. 请求您必须读取一个巨大的文件并将其转储到数据库中。在这种情况下,您可以使用多个线程逐行读取并插入到数据库中。
正如我所说,这取决于。
【讨论】:
大多数 Web 应用程序服务器在自己的线程上处理传入请求。这意味着如果您的服务器同时处理 5 个请求,它会运行 5 个线程。
这通常足够多线程来充分运行中型到大型服务器。
但是,如果您有非典型的工作负载(例如很少的请求,但每个请求都包含繁重的计算),那么在此基础上引入您自己的多线程 可能是值得的投资。
【讨论】: