选择器是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. android之自定义ViewGroup和自动换行的布局的实现

    viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上 找了下,没有相关的例子,但是找到了思路:自定义一个viewgr ...

  2. VS C# 快捷键

    解决VS2010中工具箱的的不见的问题:按快捷键Ctrl+Alt+X 全屏:Shift+Alt+Enter注释选定内容:Ctrl+E+C/Crtr+E+U代码格式化:ctrl+E+F ======== ...

  3. Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置

    QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有m ...

  4. xcode 高亮

    Cmd+E, Cmd+F and Cmd+G combo is usefull. Depending on why you want to do this, edit all in scope (Ct ...

  5. Android(java)学习笔记147:textView 添加超链接(两种实现方式,,区别于WebView)

    1.方式1: LinearLayout layout = new LinearLayout(this); LinearLayout.LayoutParams params = new LinearLa ...

  6. UIPickerView(选择器)

    UIPickerView也是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. UIPicke ...

  7. Mysql+keeplived+lvs

    最近要做个高可用的mysql.用mysql主主复制方式保证两台数据库的数据一致.结合lvs和keepalived一起使用(keepalived+lvs的设置会再另外一篇文章里写). 搭好环境之后,本人 ...

  8. prepare a mysql docker server

    @run server.. docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql @applica ...

  9. Web Services之SOAP学习

    Web Services之SOAP [toc] 什么是SOAP SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一 ...

  10. LaTeX 标题中使用 \bm 命令与 hyperref 的冲突

    问题 当使用 hyperref 宏包时,在标题中使用 \bm 为数学符号加粗会出现错误 \documentclass{article} \usepackage{bm} \usepackage{hype ...