zoukankan      html  css  js  c++  java
  • Java NIO之Selector

    选择器是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(草莓)去看看,是否有到来的字符要去读取;是否有传递出去的消息需要传出去。

  • 相关阅读:
    mysql将一个表的数据 重复复制多份到表中
    PHP中将指定文本内容导入到word中
    系统安全-SElinux
    通过身份证号码提取年龄,性别
    MySQL-获取某天的数据
    mysql-介绍、MySQL部署、数据类型、存储引擎
    监控系统-ELK
    监控系统-Grafana
    监控系统-zabbix
    监控系统-openfalcon
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/4412798.html
Copyright © 2011-2022 走看看