2013-12-10 44 views
31

我使用java(Servlets,JSP)2年来开发Web应用程序。在这两年中,我从来没有要求在任何项目中明确使用multithreading(因为我知道servlet容器使用线程为相同的servlet提供不同的请求)。多线程在web应用程序中的作用

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

所以我的问题是multithreading在Web应用程序中的作用是什么?任何例子multithreading可以用于Web应用程序将不胜感激。

在此先感谢。

+2

恕我直言,你绝对正确的认为,多线程在web应用中的主要作用是同时处理多个独立的请求,从而使服务器响应。 – Ingo

+4

举个例子说,你有一个用户注册页面,你需要发送该用户关于注册的电子邮件通知。在这种情况下,我们可以通过在单独线程中发送电子邮件来使用多线程。 – Foolish

+1

我正在使用多线程来解析xmls –

回答

40

多线程可用于Web应用程序,主要是当您对异步调用感兴趣时。

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

了解Web通话需要几分钟的时间 - 尤其是在GSM网络受到压力时 - 从Web线程直接调用它是没有意义的。

因此,基本上,当用户点击“激活”,则服务器将返回类似“感谢启动4G计划。你的计划将在几分钟内被激活,您将收到一条确认短信/邮件”。

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

工作流程:

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

异步,4G的计划后来被激活,用户会获得通过短信或电子邮件等通知......

5

谈到一个现实世界的例子,有几个理由使用多线程,和我不会聘请不了解它的网络开发人员。但最终,使用多线程的原因与标准和网络开发相同:您要么需要在后台完成一段时间(也就是阻止),以便在用户之间给予用户某种响应,要么您有一项任务可以通过在多个内核上运行来加速。当多线程实际上有用时,却是一个不同的问题。

情况1:即确实需要一些处理并且具有低的命中Web服务器/第二

这里多线程(如果适用于算法)是好事,因为空闲内核被利用和线程可以导致对用户的更快响应。

情况2:那确实需要一些处理,具有较高的命中Web服务器/秒

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

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

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

线程的替代方法是过程分支,就像Apache在其标准配置中那样。好处是负载分布在核心之间(主要适用于情况2),并且Web代码本身不必为使用所有核心而做任何事情,因为OS会自动处理这些核心。但是,如果负载不平衡,则某些内核可能处于空闲状态,并且不会以最佳方式使用资源。线程情况几乎总是更好的解决方案,如果它是正确的话。但是Apache/Tomcat标准配置使用非常过时的线程模型,为每个请求产生一个线程。有效地给予一定的点击次数/秒,CPU比线程更忙于实际处理这些请求。

+0

是不是情况3 JMS,消息队列等的用例?什么使用这个,多线程或消息队列? – onlinenaman

+0

通常是两者的组合。多线程允许利用所有可用的资源,以及诸如消息队列等技术来确保以100%的效率使用它们。 – TwoThe

3

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

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

当您在大规模应用程序中工作时,您必须同时处理多个请求,因为特定类型的请求可能会进行大量处理,从而降低应用程序的性能,所以很难同时处理各种请求。

让我们举一个例子,其中一个Web应用程序在提供特定类型的请求后必须通过电子邮件和SMS通知用户。与请求线程同步执行可能会降低Web应用程序的性能。 因此,多线程的作用就来了。 在这种情况下,建议通过仅负责发送电子邮件和短信的网络开发一个独立的多线程应用程序。

0

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

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