zoukankan      html  css  js  c++  java
  • Java Web服务收到请求时线程的情况

    Web请求线程的状态

    在开发中,突然想到了这样的一个问题, Java对每一次Web的请求,是否都会创建一条线程去进行处理呢?也就是说,当一个Class的方法同时有1000个请求访问时,线程是如何运作的呢?

    解释上面的问题,首先需要说一下Web服务器处理请求的几种模式:

    1、收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,不会处理下一个请求。一般的服务器不会使用这种方式实现。

    2、收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。 
    首先纠正一个错误,这并不是非阻塞,它也是阻塞的。相对第一个模型来说,它解决了主线程阻塞的问题,有了一定程度的并发量,但是在每个新开的线程中还是阻塞的。如果100个人同时访问,将会开100个线程,那1000个人,10000个人呢?频繁开关线程很消耗资源,这样实现的服务器性能依然不高。

    3、类似2的模型,但是不是每次收到请求就开一个新的线程,而是使用线程池。 
    如果不了解线程池,你可能会了解数据库连接池,由于频繁创建、关闭数据库连接会消耗资源,所以会用数据库连接池来保存一定数量的连接,如果需要就从连接池里取连接,不需要则放回连接池,不在频繁创建。线程池也是一样的道理,线程池管理多线程,性能比频繁创建线程高得多。这种方式实现的服务器性能会比2高。不过,它依然是阻塞的。线程池的线程数量通常有限制的,如果所有线程都被阻塞(例如网速慢,或者被人恶意占用连接),那么接下来的请求将会排队等待。

    4、基于Java NIO实现的服务器模型 
    上面说到的几种模型,都是基于BIO(阻塞IO)。而NIO则是非阻塞IO,它是基于IO多路复用技术(例如Reactor模式)实现,只需要一个线程或者少量线程,就可以处理大量请求。从性能上来说NIO实现的服务器并发性一般大于BIO,所以可以实现高性能的服务器。如果感兴趣,可以学习一些基于NIO的网络编程框架,例如Netty、MINA。

    而我们最常见的Tomcat运行可以选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,如果想要换成NIO,可以配置server.xml:

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" .../>

    从性能上考虑建议使用NIO。

    在实际开发中,如果是要求实时响应性比较高的系统,或者采用了类似Dubbo这种SOA微服务分布式的系统,一次请求的响应时间需要进行控制,这种情况下,如果代码执行到可能发生阻塞操作的地方(例如:查询数据量比较大的表、循环多次操作Redis Cache等),往往就可能出现服务超时的问题(Timeout Exception),对于这种情况,可以考虑采用线程池解决这个问题。

    采用线程池的话,将线程池定义为全局静态对象,在方法中使用,可以将可预见的会发生阻塞操作的代码块部分放入线程池进行执行,如此这样,当主线程执行到线程池的部分,会执行线程池的run()方法,然后主线程会继续向下执行,直到最后直接返回结果,而阻塞的部分将在run()方法中执行,不会阻塞主线程的执行,这样可以达到一个异步非阻塞的快速响应。

    转载自:https://blog.csdn.net/wtopps/article/details/71339295

    如需转载请注明出处。

  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/loong-hon/p/8822481.html
Copyright © 2011-2022 走看看