是 New IO 的简称 jdk1.4提供的新api
新特性:
- Buffer缓存
2.字符集编码
3.Channel 新原始I/O
4.支持锁和内存映射文件的文件访问接口
5提供多路非阻塞式的网络I/O
BIO与NIO的区别
BIO的服务端accept是阻塞的,会一直等待客户端访问,同步阻塞
NIO新增一个selector,客户端先访问seletor注册业务,服务端在selector监听自己需要处理的业务,监听业务需要同步轮询(非阻塞)
NIO与NIO的区别
New IO是jdk1.4提供的多路非阻塞IO
No-block IO 是Block IO非阻塞 ,另起线程处理问,需要不断轮询主线程去查看子流程是否完成
new IO即select 在no block io的基础上添加一个管家select ,主线程依然需要不断轮询,但是只监听select ,select 会指派channel去完成任务,完成任务后,会在select上标识,主线程根据select查看完成情况,只获取完成任务的数据,获取后channel等待下次任务使用
select 类似线程池,channel 就是里面的核心线程
同步和异步
同步:APP要直接参与IO事件的操作;在同步处理IO事件,必须阻塞完成事件
异步:所有的IO读写事件交给操作系统取处理,因为是操作系统完成,APP还可以处理其它事务,当操作系统完成操作后返回完成信息
同步的实现模式:
1.阻塞IO事件,阻塞到read或write方法上
2.IO事件轮询,使用多路复用模式(select模式);读写事件交给专门的线程处理,该线程除了完成IO注册事件,还有不断的轮询操作系统的读写缓存区,如果数据准备好,则通知系统处理相应的业务。在这种模式下,阻塞的只有select线程,而不是所有IO线程
AIO:异步 IO java1.7支持
与多路复用的区别,多路复用本质还是异步阻塞式编程 因为在查询select 和从 channel读取数据还是阻塞的,而aio是异步非阻塞的 ,如何做到不阻塞,
这需要了解socket本质:调用linux内核传输数据,而阻塞也主要发生在这,线程需要等待数据完全读写完成后才会做别的事。所以要做到非阻塞,需要系统内核可以注册事件,到事件处理完成后,内核去中断主线程并告诉这件事处理完成了
存在问题:由于linux内核对该模式支持不佳,所以主流还是select模式
阻塞和非阻塞:
阻塞:如果目标没有达成,则一直等待
非阻塞:如果目标没有达成,仍然向下做其它处理,当目标达成后,再处理
适用场景:服务端一个线程可以对服务多个客户端,多线程下,可以连接更多客户端。
客户端依然可以用传统I/O
由于NIO编程太过复杂,所有常用第三方封装的mina,Netty
netty具体应用见自定义Rpc
网友评论