NIO and AIO
New I/O 与旧式的基于流的I/O相对
再JDK1.4纳入,特点:
1、NIO基于块Block,原来IO是基于流的
2、为所有的原始类型提供Buffer缓存支持
3、增加通道Channel对象
4、支持锁和内存映射文件的文件访问接口
5、提供了基于Selector的异步网络I/O
总结:
1、Buffer类似bean,通道Channel是具体的发送数据
2、Buffer positon记录当前位置,capacity缓冲区总容量上限代表总容量上限,limit缓冲器容量实际上限代表可读取的总容量,也就是说limit小于等于capacity
3、Channel.flip读写转换,操作Buffer把position从尾巴拉到首位
网络编程
NIO,可以设置ServerSocketChanel.ConfigureBlocking(true/false)是否阻塞读写操作
如何实现非阻塞NIO呢?
线程--》selector-->可以轮询selectorChannel去获取
NIO非阻塞流程:当selectorChannel准备好数据后,返回selectionKey(表示一对selector和channel的关系),再去拿相应已经准备好的数据
网络编程流程:
1、设置非阻塞并绑定端口号,在ssc里面注册SelectorKey的接收客户端监听事件
2、for无限循环监听客户端数据{
selector.select(); //此方法是阻塞的,只有当有selector准备好返回了selectorKey之后才会停止阻塞
获取selectorKey(set结构)
遍历Set
{
如果是接收操作,将socketchannel设置为非阻塞
修改channel,对读监听;
如果是读操作,则读channel的数据,并读写转换开启新的线程处理msg,
修改channel,对读写都监听;
如果是写操作,则获得的数据写入channel通道,
写完则关闭该通道。若该通过无数据,修改channel对读监听。
}
}
总结:将等待客户端的时间放入一个线程中,而不是让每个请求都开启一个线程,也不会导致请求延迟的时候该线程会被挂起,节省了数据准备的时间因为seletor能复用,提高运行的效率!
AIO (异步IO)
特点:
1、读完了再通知
2、不会加快IO,只是在读完后进行通知
3、使用回调函数进行业务处理
AsynchronousServerSocketChannel类 异步IO实现类
Future模式
A让B回调返回数据A,过程:A发送请求给B,B持有A的引用,先返回成功,并新开一个线程去做事情,做完将数据结果调用A的函数,形成回调。