选择器是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. 漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…

    随着互联网应用的高速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全.原因是程序猿缺少细致的 ...

  2. C++ notes for beginners

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

  3. Openfire3.8.2在eclipse中Debug方式启动最简单的方式

    一.前言 最近打算研究一下Openfire,于是打算最好能够以Debug方式启动Openfire的Server,到网上一搜,还果真早到官网的一篇文章来: http://community.ignite ...

  4. java Spring 生命周期

    1.初始化回调 <bean name="userService" class="com.sun.service.UserService" init-met ...

  5. C#微信公众号开发 -- (六)自定义菜单事件之CLICK

    微信公众号中当用户手动点击了按钮,微信公众号会被动的向用户发送文字消息或者图文消息. 通过C#微信公众号开发 -- (五)自定义菜单创建 我们知道了如何将CLICK类型的按钮添加到自己的微信公众平台上 ...

  6. Android中使用ViewPager实现广告条

    我们在使用电商或视频的手机客户端时,通常会看到广告条的效果.在网上搜索时才知道使用的是ViewPager,于是自己也做了一个Demo. 以下是效果图: 图中包括背景图片.文字描述以及白点. 其中Vie ...

  7. MVC小系列(三)【MVC的分部视图】

    MVC的分部视图: 分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为如果使用后者,系统会认为是一个标准视图,会为它加个默认的母版页(LayOut),除非 ...

  8. 华为j2ee面试题

    http://blog.csdn.net/chow__zh/article/details/7741312 java基础1.垃圾回收的优点和原理.      Java语言中一个显著的特点就是引入了垃圾 ...

  9. JDBC——数据层DAO

    DAO:Data Access Object DAO 数据层 Service 逻辑业务层 View  视图层 entity   实体层 实现增.删.改.查的数据层 public class EmpDA ...

  10. 巧谈 GCD

    转载自:http://www.jianshu.com/p/665261814e24 谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果 ...