多线程在Web应用程序中的作用

时间:2013-12-10 10:25:08

标签: java multithreading servlets web-applications

我使用java(Servlets,JSP)2年来进行Web应用程序开发。在这两年中,我从未要求在任何项目中使用multithreading(显式 - 因为我知道servlet容器使用线程为不同的请求提供相同的servlet)。

但每当我参加Web Developer职位(java)的访谈时,就会有几个与java中的线程相关的问题。我知道java线程的基础知识,所以回答问题不是问题。但有时我会因为不使用mutithreading而在开发Web应用程序时遗漏某些东西而感到困惑?

所以我的问题是multithreading在Web应用程序中的作用是什么?任何可以在Web应用程序中使用multithreading的示例都将受到赞赏。

提前致谢。

4 个答案:

答案 0 :(得分:49)

多线程可以在Web Apps中使用,主要是当您对异步调用感兴趣时。

例如,假设您有一个Web应用程序可以激活用户在GSM网络上的状态(例如激活4G计划),并在最后发送确认短信或电子邮件消息。

知道Web呼叫需要几分钟 - 特别是如果GSM网络受到压力 - 直接从Web线程调用它是没有意义的。

基本上,当用户点击“激活”时,服务器会返回类似“感谢您激活4G计划。您的计划将在几分钟后激活,您将收到确认短信/电子邮件”。

在这种情况下,服务器必须以异步方式生成一个新线程,理想情况下使用线程池,并立即向用户返回响应。

工作流:

1-用户点击“激活”按钮
2- Servlet接收请求并在线程池中激活新的“激活4G计划”任务 3- Servlet立即向用户返回HTML响应,而无需等待任务完成。
4- Http交易结束
。 。

异步,4G计划稍后会被激活,用户会通过短信或电子邮件等方式收到通知......

答案 1 :(得分:5)

谈到一个真实的例子,使用多线程有几个原因,我不会聘请一个不了解它的网络开发人员。但最终,使用多线程的原因对于标准和Web开发来说都是一样的:你要么需要在后台完成一段时间(也就是阻塞)的事情来给用户一些响应,或者你有一个任务,可以通过在几个核心上运行来加快速度。然而,当多线程实际上有用时,问题就不同了。

情况1:需要进行一些处理且点击次数较少的网络服务器

这里多线程(如果适用于算法)是一件好事,因为使用空闲核心并且线程可以更快地响应用户。

情况2 :确实需要一些处理且点击次数高的网络服务器

这里可以进行多线程,但由于核心通常忙于其他请求,因此没有资源可以正常使用它。实际上将任务分散到多个线程甚至可能对响应时间产生负面影响,因为任务现在已经碎片化并且所有部分都需要完成,但是线程的执行顺序是不确定的。因此,一个客户端可以立即收到响应,而其他客户端可能会等待超时,直到最后一个片段最终得到处理。

情况3: Web服务器必须进行一些需要很长时间的处理

这里需要多线程,没有办法绕过它。客户端不能等待几分钟或几小时才能收到响应。在这种情况下,通常会实现回调系统,因此基本上每个任务都有一个“API”,可以查询当前状态。大多数网上商店就是一个例子:您订购了一些东西,之后您可以查询您的订单状态。

线程的替代方法是进程分叉,正如Apache在其标准配置中所做的那样。好处是负载分布在核心上(主要适用于情况2),并且Web代码本身不需要做任何事情来使用所有这些核心,因为操作系统会自动处理。但是,如果您的负载不平衡,则某些核心可能处于空闲状态,并且资源未以最佳方式使用。如果做得好,线程情况几乎总是更好的解决方案。但Apache / Tomcat标准配置使用非常过时的线程模型,为每个请求生成一个线程。有效地给出一定量的点击/秒,CPU更加忙于线程而不是实际处理这些请求。

答案 2 :(得分:5)

这是一个很好的问题,我认为大多数从事Web应用程序开发的开发人员都没有明确使用多线程。 原因很明显,因为您使用应用程序服务器来部署应用程序,应用程序服务器在内部管理传入请求的线程池。

那为什么要明确使用多线程? Web应用程序开发人员需要将自己暴露给多线程?

当您在大型应用程序上工作时,您必须同时为多个请求服务器,因此很难同步地处理每种请求,因为特定类型的请求可能已经进行了大量处理,这可能会降低应用程序的性能。

让我们举例说明服务特定类型请求后的Web应用程序必须通过电子邮件和短信通知用户。与请求线程同步执行可能会降低Web应用程序的性能。 所以这里有多线程的作用。 在这种情况下,建议通过网络开发独立的多线程应用程序,该应用程序仅负责发送电子邮件和SMS。

答案 3 :(得分:0)

当您对并行操作感兴趣时,可以使用Web应用程序中的多线程,例如,从多个地址获取数据。

据我所知,多线程在线程池的不同情况下使用,可用于处理来自多个客户端的请求。