2

我对 Java 相当陌生,我的经验仅限于在 Web 容器(在我的例子中为 Jboss)上运行的基于 Web 的应用程序。

我是否正确地说,对于 Web 应用程序,Web 容器负责多线程?如果是这样,我可以在基于 Web 的应用程序中引入新的线程吗?这样做有什么好处吗?在什么情况下需要这样做?

谢谢

4

4 回答 4

7

大多数 Web 容器使应用程序运行多线程,因为容器实现了“多线程 servlet 模型”。因此,您的应用程序(您的 servlet 代码)已经由多个线程运行,因此,它必须是线程安全的(在访问共享数据时必须使用适当的同步,例如您的 servlet 类的实例字段等)

从您的 Web 应用程序中启动新线程是完全合法的。例如,您可能需要它来启动一些长时间运行的任务(在数据库中注册用户,以发送电子邮件结束,或计算PI最多 100000 位小数)并在此之后立即关闭用户 HTTP 请求,使用户的浏览器完成加载给定网址。

于 2013-06-12T12:55:53.960 回答
4

Web 应用程序服务器倾向于为每个请求创建一个新线程。因此,如果两个用户同时填写并提交表单,您可以放心,这两个请求都是使用单独的线程发送到服务器的。访问任何特定页面的并发用户数实际上将决定页面可以处理的负载。

就创建新线程而言。您当然可以使用传统的 java 方法在应用程序中创建新线程来创建新线程。

通常,您希望创建一个新线程,以防您想要执行异步任务并且不希望用户等待输出。假设在数据库中插入与用户无关的大数据通常会写入线程。

此外,如果您打算在后台执行长时间运行的任务,则代码通常编写在线程内。

有时,访问页面和请求某些内容的用户也需要位于服务器端的线程内。例如,试图访问打印机。在这种情况下,您还需要确保您的代码是在线程内编写的,并且您已经正确同步了该方法。

于 2013-06-12T13:17:16.183 回答
2

我是否正确地说,对于 Web 应用程序,Web 容器负责多线程?

大多数服务器都是多线程的,可以同时处理多个请求。

我可以在基于 Web 的应用程序中引入新的踏板吗?

的,你可以。这取决于您的要求。

这样做有什么好处吗?在什么情况下需要这样做?

如果有一个耗时的工作可以异步完成,那么使用多个线程。

例如,根据请求,您必须读取一个巨大的文件并将其转储到数据库中。在这种情况下,您可以使用多个线程逐行读取并插入数据库。

正如我所说,这取决于。

于 2013-06-12T12:52:11.660 回答
1

大多数 Web 应用程序服务器在它们自己的线程上处理传入请求。这意味着如果您的服务器同时处理 5 个请求,它会运行 5 个线程。

通常足够多线程来充分运行中型到大型服务器。

但是,如果您有非典型的工作负载(例如很少的请求,但每个请求都包含大量计算),那么在此基础上引入您自己的多线程可能值得投资。

于 2013-06-12T13:00:44.540 回答