Netty基础---NIO简介(一)

什么是NIO

Java NIO全称java non-Blocking IO 是java1.4开始,新提供一系列改进Input/Output的新特性,统称为NIO,是同步非阻塞也是面向Buffer开发的什么是同步非阻塞的呢?按照我们普通的IO来说,当一条线程去read()或write()一些数据时,会一直等待返回结果,也就是说不能干其他的事情,这样大大降低了线程的效率,如下图

在这里插入图片描述

而NIO就很好的弥补了这个问题,实现NIO主要有三个工具非常重要Buffer、Channel、Selector,我们先来看看这三个组件的关系图
在这里插入图片描述

我给大家解释一下上面的关系图

1.一个线程对应一个Selector
2.一个Selector允许注册多条Channel,也就是说一个线程对应多个Channel,上图就表示了有三个Channel注册到了Selector里
3.每个Channel都有自己的Buffer(缓冲区)
4.这里有一个重要的概念,事件(Event),Selector就是通过不同的事件来切换到不同的Channel来读写数据
5.看到上图也知道了为什么NIO是面向Buffer的了,数据的读写都是通过Buffer,Buffer是一个内存块
6.IO、BIO都是通过流(Stream)来进行读取数据,要么读、要么写,但是NIO通过Buffer做到了读写皆可,使用flip()切换,也表明的Channel是双向

来看看使用NIO时线程的使用效率

在这里插入图片描述

NIO与其它IO的区别

NIOBIOAIO
IO模型同步非阻塞同步阻塞异步非阻塞
吞吐量
java对各I/O的支持服务器实现一个请求一个线程,当服务器收到了连接请求注册到Selector上,然后Selector来通过轮询来查看有没有新的I/O请求,有的话则启动线程来处理服务器实现一个请求一个线程,即来一个请求启动一个线程进行接收,但是如果线程长时间处于无事可做的状态会导致CPU开销过大,使用线程池处理的问题:同步阻塞IO,读写阻塞,线程等待时间过长;多线程之间的上下文切换,耗费资源;需要根据CPU来限定可用线程的数量,不能根据并发数,要不然很难做到公平的资源分配服务器实现一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理
适用场景分析连接数量多且适用小文件传输架构,例如IM服务器,JDK1.4后开始支持连接数量少且固定的架构,对服务器资源要求高,并发局限于应用程序中,JDK1.4前的唯一选择连接数量多且适用大文件传输架构,充分调用OS进行并发,JDK7之后开始支持
开发难度复杂简单复杂

完成:2021/3/27 16:57 ALiangX

转载请标注原作者,谢谢你们的支持,能给个小心心吗?
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀顶峰相见的PET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值