http://blog.csdn.net/hsuxu/article/details/9876983

之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识:

Java NIO中的选择器依赖操作系统内核的这些系统调用,我们这里只讲解与linux内核相关的NIO实现,当然,windows或其他操作系统实现大体上是类似的,相信大家也可以触类旁通。

那么,本文从这里将从简到难,一步一步为大家讲解选择器的点点滴滴吧。

选择器的宏观理解

“有这么一种检查员,她工作在养鸡场,每天的工作就是不停的查看特定的鸡舍,如果有鸡生蛋了,或者需要喂食,或者有鸡生病了,就把相应信息记录下来,这样一来,鸡舍负责人想知道鸡舍的情况,只需要到检查员那里查询即可,当然,鸡舍负责人得事先告知检查员去查询哪些鸡舍。“

以上这段话即为选择器所做工作的一个比喻,实际上选择器为通道服务,通道事先告诉选择器:“我对某些事件感兴趣,如可读、可写等“,选择器在接受了一个或多个通道的委托后,开始选择工作,它的选择工作就完全交给操作系统,linux下即为poll或epoll。

选择器的创建

当调用Selector.open()时,选择器通过专门的工厂SelectorProvider来创建Selector的实现,SelectorProvider屏蔽了不同操作系统及版本创建实现的差异性。具体实现代码如下:

java.nio.channels.Selector

public static Selector open() throws IOException {

return SelectorProvider.provider().openSelector();

}

因为SelectorProvider本身为一个抽象类,通过调用provider()提供对应的Provider实现,如PollSelectorProvider、EPollSelectorProvider

java.nio.channels.spi.SelectorProvider

public static SelectorProvider provider() {

synchronized (lock) {

if (provider != null)

return provider;

return (SelectorProvider)AccessController

.doPrivileged(new PrivilegedAction() {

public Object run() {

if (loadProviderFromProperty())

return provider;

if (loadProviderAsService())

return provider;

provider = sun.nio.ch.DefaultSelectorProvider.create();

return provider;

}

});

}

}

默认的Provider实现即为DefaultSelectorProvider,通过调用create(),得到具体的SelectorProvider

sun.nio.ch.DefaultSelectorProvider

public static SelectorProvider create() {

PrivilegedAction pa = new GetPropertyAction("os.name");

String osname = (String) AccessController.doPrivileged(pa);

if ("SunOS".equals(osname)) {

return new sun.nio.ch.DevPollSelectorProvider();

}

// use EPollSelectorProvider for Linux kernels >= 2.6

if ("Linux".equals(osname)) {

pa = new GetPropertyAction("os.version");

String osversion = (String) AccessController.doPrivileged(pa);

String[] vers = osversion.split("\\.", 0);

if (vers.length >= 2) {

try {

int major = Integer.parseInt(vers[0]);

int minor = Integer.parseInt(vers[1]);

if (major > 2 || (major == 2 && minor >= 6)) {

return new sun.nio.ch.EPollSelectorProvider();

}

} catch (NumberFormatException x) {

// format not recognized

}

}

}

return new sun.nio.ch.PollSelectorProvider();

}

这是linux操作系统下的DefaultSelectorProvider的实现,可以看到,如果内核版本>=2.6则,具体的SelectorProvider为EPollSelectorProvider,否则为默认的PollSelectorProvider

结合上文,可以猜测一下EPollSelectorProvider提供的Selector肯定是与内核epoll有关的,PollSelectorProvider提供的

Selector肯定是与poll有关的。的确如此:

sun.nio.ch.EPollSelectorProvider

public AbstractSelector openSelector() throws IOException {

return new EPollSelectorImpl(this);

}

sun.nio.ch.PollSelectorProvider

public AbstractSelector openSelector() throws IOException {

return new PollSelectorImpl(this);

}

java nio epoll_Java NIO 选择器(Selector)的内部实现(poll epoll)相关推荐

  1. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

  2. Java NIO 选择器(Selector)的内部实现(poll epoll)

    http://blog.csdn.net/hsuxu/article/details/9876983 转载于:https://www.cnblogs.com/hnucdj/p/4321119.html

  3. 【Netty】NIO 选择器 ( Selector ) 简介

    文章目录 I . 选择器 ( Selector ) II . 选择器 ( Selector ) 与 NIO 特性 III . 选择器 ( Selector ) API 简介 IV . Selectio ...

  4. java nio channel原理_Java NIO 选择器(Selector)与通道(Channel) 原理 | 学步园

    NIO底层实现poll, epoll(jdk1.5update 9  和jdk1.6  仅限于 linux 2.6以上 ) Java NIO 选择器(Selector) 知识预备 (linux epo ...

  5. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例

    文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...

  6. Java NIO网络编程之Selector

    概述 Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端连接(多路复用),就会用到Selector(多路复用器/选择器). Selector能够检测多个注册通道channel上是否有 ...

  7. 深入理解JAVA中的NIO

    2019独角兽企业重金招聘Python工程师标准>>> 前言: 传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低. 所以,jdk ...

  8. Java IO BIO NIO

    Java IO BIO NIO 一.Java I/O概述 1.1 什么是流 1.2 流的分类 1.3 字符流 1.3.1 Reader 1.3.2 Writer 1.4 字节流 1.4.1 Input ...

  9. 【学习笔记】JAVA IO与NIO(new IO)的对比与不同IO模型的理解

    JAVA IO 分类: 几种IO 模型 1. 阻塞 IO 模型 2. 非阻塞 IO 模型 JAVA NIO 多路复用 IO 模型(即Java中的NIO) JAVA IO 思维导图: 分类: 按照流的方 ...

最新文章

  1. 偏前端 - vue-cli(axios请求数据==》token+按接口参数顺序(参数值拼接base64)- MD5)...
  2. 44 ansible ad-hoc模式
  3. IOS开发学习记录第5天之C语言学习
  4. Docker 解决容器时间与主机时间不一致的问题三种解决方案
  5. Java中的内存划分
  6. 噪音声压和声功率的区别_南昌汽车隔音,深入了解汽车噪音的来源、危害以及解决方案...
  7. jQuery中国各个省份地图分部代码
  8. oracle查询语句子句,Oracle 查询执行顺序
  9. 多线程下的单例模式你真的了解吗?
  10. 一觉醒来感觉自己回到了九八年, 让大数据来解释
  11. python蓝桥杯跑步训练
  12. iphone6主板注释
  13. ubuntu18.04安装tftpd服务器
  14. ThinkPad T43续命记
  15. mac电脑如何查看cpu占用率?以及如何修复Mac的“ kernel_task” CPU使用率过高的Bug
  16. Hive sum over partition preceding following 累计求和
  17. Chrome 添加自定义搜索引擎
  18. 苹果id退出后数据还在吗_答疑你的手机连接WiFi后,会关闭移动数据吗?
  19. Linux C多人网络聊天室
  20. 如何让DIV水平和垂直居中

热门文章

  1. [转]Multiple outputs from T4 made easy
  2. Json.Net系列教程 3.Json.Net序列化和反序列化设置
  3. Xamarin效果第十八篇之GIS中复合型Mark
  4. .NET Conf 2021 正在进行中,带你看一看微软带来了什么内容
  5. 字节前端终于开源!吹爆!
  6. EPPlus导出Excel感觉很不错~~~
  7. netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布
  8. .NET和.NET Core Web APi FormData多文件上传
  9. 博客系统知多少:揭秘那些不为人知的学问(四)
  10. .NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记