Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程在web应用中的作用_Java_Multithreading_Servlets_Web Applications - Fatal编程技术网

Java 多线程在web应用中的作用

Java 多线程在web应用中的作用,java,multithreading,servlets,web-applications,Java,Multithreading,Servlets,Web Applications,我使用java(Servlets,JSP)开发web应用程序已经两年了。在这两年中,我从未要求在任何项目中使用多线程(明确地——正如我所知,servlet容器使用线程为不同的请求提供相同的servlet) 但每当我参加Web开发者职位(java)的面试时,都会有几个与java线程相关的问题。我知道java线程的基础知识,所以回答这些问题不是问题。但有时我会感到困惑,在开发web应用程序时,是否因为没有使用多线程而遗漏了什么 所以我的问题是,多线程在Web应用程序中扮演什么角色?任何可以在web应

我使用java(Servlets,JSP)开发web应用程序已经两年了。在这两年中,我从未要求在任何项目中使用
多线程
(明确地——正如我所知,servlet容器使用线程为不同的请求提供相同的servlet)

但每当我参加Web开发者职位(java)的面试时,都会有几个与java线程相关的问题。我知道java线程的基础知识,所以回答这些问题不是问题。但有时我会感到困惑,在开发web应用程序时,是否因为没有使用多线程而遗漏了什么

所以我的问题是,
多线程
在Web应用程序中扮演什么角色?任何可以在web应用程序中使用
多线程
的示例都将受到欢迎


提前感谢。

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

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

知道网络呼叫需要几分钟时间——特别是在GSM网络受到压力的情况下——直接从网络线程呼叫是没有意义的。

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

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

工作流程:

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


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

说到一个真实的例子,使用多线程有几个原因,我不会雇佣一个不知道的web开发人员。但归根结底,使用多线程的原因对于标准开发和web开发来说是一样的:您要么希望在后台做一些事情(也称为阻塞),以便在两者之间给用户一些响应,要么有一个任务可以通过在多个核上运行来加速。然而,多线程何时真正有用则是另一个问题

情况1:需要一些处理且每秒点击率较低的web服务器

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

情况2:需要一些处理并且每秒点击率高的web服务器

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

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

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


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

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

那么为什么要显式使用多线程呢?web应用程序开发人员需要将自己暴露在多线程环境中吗

在处理大型应用程序时,必须同时处理多个请求,因此很难同步处理每种请求,因为特定类型的请求可能会进行大量处理,从而降低应用程序的性能

让我们举一个例子,web应用程序在服务于特定类型的请求后必须通过电子邮件和SMS通知用户。与请求线程同步执行可能会降低web应用程序的性能。因此,这里是多线程的角色。
在这种情况下,建议通过网络开发一个独立的多线程应用程序,只负责发送电子邮件和SMS。

web应用程序中的多线程