Java NIO和AIO的一些见解

一、NIO的缓冲翻转

ByteBuffer在经过read()写入数据后,需要调用flip()方法翻转,才能被读取,调用SocketChannel的write()方法输出。

二、NIO的Selector的阻塞选择和唤醒

1、有select()方法来阻塞选择。

2、select(超时时间) 可以在规定时间内返回。

超时就抛出异常。

3、唤醒和退出

如果阻塞在select()方法,或者更新Channel的事件注册,需要调用wakeup()方法,来立即返回select()方法。

唤醒后就能判断最新的事件,就能判断循环退出的标志变量。

while(isRun){

if(selector.select() > 0){

// 处理通道满足的事件

}

}

三、NIO如何确定事件注册时机

以HTTP协议的服务端为案例:

1、服务端注册Accept事件。

2、处理Accept连接事件时,注册Read读取事件。

3、处理Read事件时,先取消Read注册,然后分多次读取HTTP的请求行、请求头、请求体,封装成请求对象。

同时判断URL对应的逻辑,添加Write事件。

4、处理Write事件时,先取消Write注册,然后把头部输出,把响应体输出。

短链接就可以是直接关闭连接。

如果是长连接,可能无法确定写入顺序;需要队列来确定输出任务的顺序。

每次处理事件时,需要先把事件注册取消;等本次处理完毕后,再根据需要添加下回的事件注册。

四、AIO的异步调用怎么设置顺序

1、用AIO来异步读取协议数据包的每个部分,可能需要分多次读取。

2、用AIO来异步输出协议数据包的头部和负载数据,可能需要2次以上调用。

3、如何控制调用顺序?

第一种、把每个任务按顺序放入队列里。

每次调用就获取一个任务,等任务调用完成后,才获取下一个任务。

第二种、当前任务调用完成后,传入新的参数,再递归调用自己,添加监听事件。

相关推荐
Full Stack Developme3 天前
Tomcat NIO连接器内部如何实现零拷贝 Session管理如何实现集群同步
java·tomcat·nio
Full Stack Developme3 天前
MinIO 设计及工作原理
nio
易连EDI—EasyLink6 天前
电动汽车供应链协同新范式:蔚来(NIO)企业级EDI平台建设实践
网络·人工智能·edi·nio·as2
我是唐青枫11 天前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
2601_9639329812 天前
人流后多久来月经?内膜恢复周期与术后修护科普指南
nio
ywl47081208724 天前
第二章Netty,半包读取问题
netty·nio
EntyIU25 天前
Java NIO 实战
java·开发语言·nio
ywl4708120871 个月前
第一章Netty,如何实现I/O多路复用的功能
netty·nio·selector
ywl4708120871 个月前
第一章Netty,NIO零拷贝详解
netty·nio·selector
小bo波1 个月前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制