选择器是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. 数扰结构-visualization

    http://www.cs.usfca.edu/~galles/visualization/Algorithms.html?url_type=39&object_type=webpage&am ...

  2. 利用QT制作我们自己的一个计算器

    有了前面的经验就比较容易创建一个 属于我们自己的计算器了. 一些简单的拖拽就可以实现了. 界面设计部分: 转到槽之后的代码部分: #include "widget.h" #incl ...

  3. 循环json里面的数据

    {{each company as cvalue i}}   {{each value.Goods as gvalue i}}   {{each gvalue.SKU as value i}}     ...

  4. 20151221jquery学习笔记---日历UI

    妹的,这几天真是无语了,参加了一个无聊的比赛,简直浪费时间,好几天没学jquery啊,今天学了一点,不过快要期末考试了,估计得攒到寒假了啊. 日历(datepicker) UI, 可以让用户更加直观的 ...

  5. jasper3

    package jasper; import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStr ...

  6. 3.redis.3.2 下载,安装、配置、使用、集群主从创建 - 3

    当然,集群最主要的就是配置文件: 简单配置如下, port 7001 bind 127.0.0.1 databases 16 appendonly yes appendfilename "a ...

  7. memcache的分布式算法(转)

    memcached的分布式 正如第1次中介绍的那样, memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能. 服务器端仅包括 第2次. 第3次 前坂介绍的内存存储功能,其实现 ...

  8. 如何诊断oracle数据库运行缓慢或hang住的问题

    为了诊断oracle运行缓慢的问题首先要决定收集哪些论断信息,可以采取下面的诊断方法:1.数据库运行缓慢这个问题是常见还是在特定时间出现如果数据库运行缓慢是一个常见的问题那么可以在问题出现的时候收集这 ...

  9. C#查询当前微信自定义菜单结构

    查询 string access_token = "你的token"; string posturl = "https://api.weixin.qq.com/cgi-b ...

  10. Objective-C description的用法

    description类似于.net/java ToString()方法的用途. 假设有一个CTPerson类, - (NSString *)description { return @"d ...