服务端线程模型-NIO服务模型
Posted fudashi233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务端线程模型-NIO服务模型相关的知识,希望对你有一定的参考价值。
上接《服务端线程模型-线程池服务模型》(https://www.cnblogs.com/fudashi233/p/10549221.html)。
这篇分享从最初的单线程服务模型一直演进到线程池服务模型,充分发挥出了现在多核CPU机器的优势,但是当面对万级别的qps时,仍然可能因为线程池打满而拒绝掉大量请求。
比如可能有不少请求需要大量IO资源,导致IO阻塞的耗时较长,这就会导致其一直占用宝贵的线程池资源,导致后续的请求的响应时间长。
这时就需要使用NIO服务模型了,基于Selector的事件监听机制,他会轮询已经建立的Socket,将准备好了的请求交给CPU处理,充分利用线程资源。
基本的代码模型如下所示
while (selector.select() > 0) { // 轮询/监听底层Socket Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); // 获取准备就绪的事件 if (selectionKey.isAcceptable()) { // 发生客户端连接事件 } else if (selectionKey.isReadable()) { // 发生读事件 } } else if (selectionKey.isWritable()) { // 发生写事件 } selectionKey.cancel(); selectionKey.channel().close(); iterator.remove(); // 删除选择键 } }
以上是关于服务端线程模型-NIO服务模型的主要内容,如果未能解决你的问题,请参考以下文章
曹工说Tomcat:200个http-nio-8080线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)