A. 在javaweb当中,servlet在运行阶段,针对每个客户端的请求,都会创建一个线程,该线程调用servlet的实例
具体servlet的请求处理,这个是分配给线程池线程处理的,servlet容器都这样实现,这个没什么问题。我主要来说说其它的。
线程池的作用
从其他人的回答看,都是太高看线程池本身的作用了。
线程池作为一种资源池(这里的资源就是线袜丛程了)模型,最大的优点是重复利用已经创建的线程,避免线程的反复创建和销毁带来的处理器和内存的消耗。而除此之外,它丛蠢需要配合其它机制才能发挥更大的作用。
请求到达服务器后,如果线程池没有可用线程,请求会进入队列排队,如果超过队列最大阈值会被丢弃。重点来了,如果你的请求处理服务会有如数据库调用/远程服务调用的IO处理,而你用的阻塞模型,则这个线程在请求处理完成之前并不能返还到线程池供其它请求服务。这种长期占用线程的行为,会严重限制请求的并发。线程的有效利用率太低,大部分时间都在阻塞中,这个和你有没有线程池没有关系。所以要在高并发的情况下保证性能,重点是你的服务内部的使用异告郑樱步IO避免阻塞。这样在你某个请求处于IO等待期间,当前线程可以返还给线程池继续提供服务。
(补充)
下面有朋友提到了请求队列,这里简单说下。
请求队列是所有服务器程序都会考虑和设计的一个机制,这样的机制实际上起缓冲层作用,避免服务器在请求过多时崩溃。以Tomcat为例,Connector中有下面几个关键配置。
acceptCount就是允许未处理请求队列的长度(backlog),默认是100,可以根据实际情况做调整。
更多的配置参见官方文档。如果有时间,会写一个Tomcat具体如何实现请求队列及它的处理文章。
请求响应
更友好的体验还要从客户端出发来考虑,如果你能缩短请求的处理时间,客户端体验是极好的,比如成都访问杭州阿里云服务器,空载来回大概40ms的时间,如果你的服务处理控制在10ms以内,请求在50ms就可以返回,是不是很舒服?当然如果是静态资源做CDN几ms就可以完成。
要缩短请求响应时间,可以从两方面入手:
1、将服务分解成多个可以并行处理的任务,这里的任务一般都会包含一个异步IO调用,然后并行执行。
2、将不影响响应结果的子任务异步处理,提前返回响应。比如推送消息,日志记录等。考虑一些极端的情况:在双11和秒杀场景,只有商品的库存处理是最核心的,这个环节处理完就可以结束本次处理,像支付这种繁琐的处理就可以延后,还有部分操作都可以放入异步队列继续处理。
将请求分解异步并行化后,实际上又会多出很多线程切换,这个时候线程池的作用就被放大了。
总结
仅仅有线程池而没有异步并行框架的支撑,线程池其实只能发挥很小的作用,在高并发情况下它必不可少,但非最核心的那个东西。我们一般的Web应用都是IO密集型的,只要保证服务内的IO都异步化,线程池只需非常少量的线程就可以应对大量并发。
B. java 怎么配置servlet
部署Servlet环境(大体分2个步骤):
第一步:在Tomcat根目录下的webapps目录下创建如下目录,并且放相应的文件:
• /FirstWebApp
• /FirstWebApp/WEB-INF/classes:存放servlet类编译后的.class文件
• /FirstWebApp/WEB-INF/web.xml:存放servlet的配置文件
第二步:配置web.xml文件,如下图:
C. Java中的Servlet的定义,Servlet的具体用途
Servlet是一个实现了Servlet接口的类,一个与访问协议和平台无关的、运行在Servlet容器中的Java程序。
针对Servlet实现技术,SUN公司提供了一套标准的Java Servlet API以便于更快速、规范地开发Servlet程序。这套Servlet API中,最重要的两个软件包是:javax.servlet、javax.servlet.http。
javax.servlet是一个与通信协议无关的通用软件包;javax.servlet.http是一个支持HTTP访问协议的软件包,这两个软件包的同时存在,使得Servlet API能支持任何协议的请求/响应。
在javax.servle中,包含着一套常用接口,负责承担指定的任务。下表中列出了常用的类和接口:
javax.servlet软件包:
javax.servlet包中定义了与通信协议无关的接口和类。
常用接口:
RequestDispatcher、Servlet、ServletConfig、ServletContext、ServletRequest、ServletResponse。
常用类:
GenericServlet、ServletInputStream、ServletOutputStream。
1、RequestDispatcher接口
public interface RequestDispatcher;
资源调度器接口,用于定义一个在服务器内部直接实现资源转发的对象。
RequestDispatcher对象由Servlet容器创建,用于封装并调度由一个特定的URL定义的服务器资源。
(1)请求传递方法
public void forward(ServletRequest request,
ServletReponse response) throws ServletException,IOException
从一个Servlet向服务器上的另一个资源传递请求。
将请求转发给其他资源时,将由被调用的资源负责对请求作出响应,而原先Servlet的执行则终止。
public void include(ServletRequest request,
ServletResponse response) throws ServletException,IOException
从一个Servlet向服务器上的另一个资源传递请求。
将请求转发给其他资源时,被调用的Servlet对该请求作出的响应将并入原先的响应对象中,原先的Servlet还可以继续输出响应消息。
2、Servlet接口
public interface Servlet;
开发一个Servlet需要实现的基础接口。
接口中定义了5个方法:
init():Servlet初始化方法,通过init()方法可以获得容器创建的ServletConfig对象
service():请求处理方法
destroy():Servlet实例销毁方法
getServletConfig():获取ServletConfig配置对象方法
getServletInfo():获取Servlet相关信息方法
(1)初始化方法
public void init(ServletConfig config) throws ServletException
Servlet容器会在Servlet实例化之后,调用init方法对Servlet对象进行初始化,该方法由Servlet容器顺序调用,无需Servlet自身考虑何时执行。
(2)服务方法
public void service(ServletRequest request,
ServletResponse response) throws ServletException,IOException
当Servlet容器接收到客户请求时,调用service方法响应客户请求,service方法在Servlet实例化、初始化之后被调用,并且可以被多次调用。
(3)销毁方法
public void destroy()
当Servlet实例从服务器中移除或服务停止时,Servlet容器调用destroy方法销毁Servlet实例。
(4)获取Servlet配置对象方法
public ServletConfig getServletConfig()
获取一个由Servlet容器创建的ServletConfig配置对象,这个对象常常用在Servlet初始化方法中,将初始化参数封装在ServletConfig对象中,然后传递给Servlet。
(5)获取Servlet相关信息方法
public String getServletInfo()
获取关于Servlet的一些相关信息,返回的字符串是纯文本格式而不带有任何标记(例如:HTML、XML等)。
3、ServletConfig接口
public interface ServletConfig;
Servlet配置信息接口,在Servlet初始化时,Servlet容器将Servlet初始化参数封装在ServletConfig对象中,并传递给Servlet,一个Servlet实例只有一个ServletConfig对象。
接口中,只定义了4个方法:
getInitParameter():获取Servlet指定初始化参数的值
getInitParameterNames():获取Servlet所有初始化参数名称
getServletContext():获取Servlet容器为WEB应用创建的Servlet上下文环境对象ServletContext
getServletName():获取Servlet名称
(1)获取初始化参数方法
public String getInitParameter(String name)
根据初始化参数名称,获取Servlet指定初始化参数的值,如果指定的参数不存在,返回空值null。
public Enumeration getInitParameterNames()
获取Servlet所有初始化参数名称,如果Servlet没有初始化参数,返回一个空列表。
(2)获取Servlet上下文环境方法
public ServletContext getServletContext()
获取Servlet容器为WEB应用创建的Servlet上下文环境对象ServletContext,WEB服务器启动的时候,在加载WEB应用时,为每个加载的WEB应用创建一个代表WEB应用Servlet上下文环境对象。
(3)获取Servlet名称方法
public String getServletName()
获取正在访问的这个Servlet的名称。
以上就是Servlet相关问题的解答,更多关于Java Web方面的问题可以看下这个详细的视频教程网页链接,希望我的回答能帮到你。