很多人学到 Selector 时会卡在这里:内核都已经告诉你某个连接可读了,那数据到底是谁去把它读出来?答案通常没有那么神秘,标准 NIO 模型里还是线程自己继续调用 read()。
Selector 负责的是通知
Selector 的作用是告诉你哪些 Channel 已经就绪,比如可读、可写或可连接。它并不会替你把应用层数据直接搬到业务对象里。
真正读取通常是谁做
一般就是处理这次 select 结果的那个线程继续调用 read()。如果框架做了线程池切换,也只是把“谁来读、谁来执行业务”进一步拆分,不代表内核替应用完成了读取逻辑。
为什么这点重要
因为只有分清“收到就绪通知”和“真正消费数据”不是一回事,才能理解 Reactor、线程模型和业务解码为什么要分层设计。
结论
NIO 里可读事件只是一个信号,真正把数据读出来,通常还是由应用线程完成。
正文完




