选择器是JavaNIO重磅推出的一个概念;在旧有的系统中为了跟踪多端口消息,需要为每一个端口配备一个线程做监听;但是有了selector就不需要了,一个Selector可以管理一众渠道(channel)。

选择器的本质就是:让监听的工作由选择起来做;它会定时执行来获取注册到他那里的渠道是否已经准备就绪,比如socketServerChannel是否有新的消息过来(是否做好了accept的准备);然后他会把这个channel放入到一个集合中(SelectedKeys),遍历一遍之后,就可以,你就可以通过方为那个集合来获取需要处理的渠道了。这就像Java NIO搞了一个看园老大爷,定时会到在草莓园走一圈,将所有的成熟的草莓放入到篮子中,采摘完成后把篮子放在门口;这个时候你再安排工作人员(Thread)取走草莓(吃到,深加工都可以哦)。

旧有的模式则是直接为每一个草莓树(草莓是树上接的吧)安排一个人(线程),来定时观察,发现熟了,便进行处理。这样是不是成本很高呢?现有的机制,如果没有草莓,我也不需要安排更多的人力监控草莓的情况,让他们(资源)干更重要的事情;只有需要的时候再安排他们处理。

接着上面的隐喻,草莓园就是选择器(Selector),园丁就是执行selector.select()的线程。草莓就是渠道(SelectableChannel),如果想要把草莓放到草莓园中,需要通过草莓栽种(SelectableChannel.register());篮子呢?就是SelectedKeys。

回到冰冷的显示,SelectionKey里面定义了几种操作,Read,Write,connect以及accept,SelectionKey的创建来自于草莓的栽种,SelectableChannel.register(Selector sel, int ops, Object att),操作是通过ops来进行的。本质上就是在注册的时候已经指定了需要园丁(selector.select())监控的内容;监控内容不能放在渠道上面,不能告诉园丁,那就在草莓上面挂的小牌子(SelectionKey)上面记下了。

最后说一下工作人员,如果篮子里面的草莓很多,或者深度加工时间很长,能是单线程处理,可能需要一个线程池来进行处理,保证准备好的渠道可以尽快被处理,并且尽量互不干扰。

后续补充:

其实selector以及channel本质适合传统的“生产者-消费者”的概念是一样的,所谓的园丁就是一个线程来监控生产者是否有生产(对于消费者而言),监控消费者是否有需求(对于生产者而言),园丁定时到各个channel(草莓)去看看,是否有到来的字符要去读取;是否有传递出去的消息需要传出去。

Java NIO之Selector的更多相关文章

  1. Java NIO类库Selector机制解析(下)

    五.  迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/O要设计成这个样子?如果说老的I/O不能多路复用,如下图所示,要开N多的线程去挨个侦听每一个Channel ...

  2. Java NIO类库Selector机制解析(上)

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

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

    http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NI ...

  4. Java NIO类库Selector机制解析--转

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  5. Java NIO之Selector(选择器)

    历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂re ...

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

    转自:http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java ...

  7. Netty快速入门(05)Java NIO 介绍-Selector

    Java NIO Selector Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读.可写.如此可以实现单线程管理多个channels,也就是 ...

  8. Java NIO教程 Selector

    这次我们开讲非阻塞I/O中的Selector,它需要配合非阻塞的TCP和UDP来使用.首先我们先简单讲一下TCP和UDP的非阻塞通道. 非阻塞I/O通道 在上代码前我们先讲解一些最基本的知识.TCP和 ...

  9. JAVA NIO 之 Selector 组件

    NIO 重要功能就是实现多路复用.Selector是SelectableChannel对象的多路复用器.一些基础知识: 选择器(Selector):选择器类管理着一个被注册的通道集合的信息和它们的就绪 ...

随机推荐

  1. java14 处理流

    二.处理流 .引用类型,保留数据+类型 序列化:将对象保存到文件或者字节数组中保存起来,叫序列化.输出流:ObjectOutputStream.writeObject(). 反序列化:从文件或者字节数 ...

  2. Multipart Upload with HttpClient 4--reference

    by Eugen Paraschiv on May 23, 2014 in HttpClient http://www.baeldung.com/httpclient-multipart-upload ...

  3. Android主题切换方案总结

    所谓的主题切换,就是能够根据不同的设定,呈现不同风格的界面给用户,也就是所谓的换肤. 1.将主题包(图片与配置)存到SD卡上(可通过下载或手动放入指定目录),在代码里强制从本地文件创建图片与配置文字大 ...

  4. install lua client for redis-server on Mac

    1. lua client library for redis-server https://github.com/nrk/redis-lua 2. dependent luasocket https ...

  5. 移动平台作业——天气预报——天气数据的获得——为应用申请百度ak码

    需求: 可切换城市 可实时更新(按钮或手势或下拉刷新) 可现实未来三日的天气 不限制横屏或者竖屏,不限制布局样式,但要求得到的数据均需显示(北京.天气数据.天气图标) 提示: 获得实时天气数据(任选一 ...

  6. C++ notes for beginners(2)

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  7. Java内存模型浅析

    JVM在执行java程序时会将它所管理的内存划分成若干个不同的数据区域.如图所示: 其中方法区和堆是所有线程共享的数据区,其他区域则是线程隔离的数据区. 这些区域的功能各有不同: 程序计数器:可以理解 ...

  8. mvc给html扩展方法:

    mvc给html扩展方法: 注意:扩展方法和所在的类都必须是 public static如果在页面直接使用新扩展的方法,需要web.config里把Web.Helper名称命名空间加上,页面才能访问到 ...

  9. linux x64下编译libjpeg,libpng,zlib

    libJpeg编译: 下载libjpeg源码:http://www.ijg.org/,下载jpegsrc.v9a.tar.gz 解压源码,命令:tar -zxvf jpegsrc.v9a,源码文件夹为 ...

  10. jQuery弹性滑块导航

    曾起何时在某网站上看到一弹性滑块导航的效果,瞬间被些效果吸引,开始以为是用FLASH实现的,但查源代码发现用的是JQuery缓动效果. 今天心血来潮想拿这个效果练练手.也看看这段时间学习JS及jque ...