Java NIO类库Selector机制解析
一、 前言 自从 J2SE 1.4 版本以来, JDK 发布了全新的 I/O 类库,简称 NIO ,其不但引入了全新的高效的 I/O 机制,同时,也引入了多路复用的异步模式。 NIO 的包中主要包含了这样几种抽象数据类型: Buffer :包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的 I/O 操作。 Charset :它提供 Unicode 字符串影射到字节序列以及逆映射的操作。 Channels :包含 socket , file 和 pipe 三种管道,都是全双工的通道。 Selector :多个异步 I/O 操作集中到一个或多个线程中(可以被看成是 Unix 中 select() 函数的面向对象版本)。 我的大学同学赵锟在使用 NIO 类库书写相关网络程序的时候,发现了一些 Java 异常 RuntimeException ,异常的报错信息让他开始了对 NIO 的 Selector 进行了一些调查。当赵锟对我共享了 Selector 的一些底层机制的猜想和调查时候,我们觉得这是一件很有意思的事情,于是在伙同赵锟进行过一系列的调查后,我俩发现了很多有趣的事情,于是导致了这篇文章的产生。这也是为什么本文的作者署名为我们两人的原因。 先要说明的一点是,赵锟和我本质上都是出身于 Unix/Linux/C/C++ 的开发人员,对于 Java