码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Netty——NIO(Selector)


    目录

      • 一、多路复用
      • 二、Selector的概述
        • 2.1、Selector的优点
        • 2.2、Selector的创建
        • 2.3、Selector绑定 Channel 事件
        • 2.4、Selector监听 Channel 事件
        • 2.5、Selector何时不阻塞

    一、多路复用

    • 单线程可以配合 Selector 完成对多个 Channel 可读写事件的监控,这称之为多路复用。
    • 多路复用仅针对网络 IO、普通文件 IO 没法利用多路复用。
    • 如果不用 Selector 的非阻塞模式,线程大部分时间都在做无用功,而 Selector 能够保证
      (1)、有可连接事件时才去连接;
      (2)、有可读事件才去读取;
      (3)、有可写事件才去写入;
      (4)、限于网络传输能力,Channel 未必时时可写,一旦 Channel 可写,会触发 Selector 的可写事件;

    二、Selector的概述

    2.1、Selector的优点

    • 一个线程配合 selector 就可以监控多个 channel 的事件,事件发生线程才去处理。避免非阻塞模式下所做无用功;
    • 让这个线程能够被充分利用;
    • 节约了线程的数量;
    • 减少了线程上下文切换;

    2.2、Selector的创建

    • Selector创建的语法

       //创建Selector,管理多个channel
       Selector selector = Selector.open();
      
      • 1
      • 2

    2.3、Selector绑定 Channel 事件

    • Selector绑定 Channel 事件也称之为注册事件,绑定的事件 selector 才会关心。

    • Selector绑定 Channel 事件语法

      channel.configureBlocking(false); 
       /**
        * 3、建立Selector与channel的联系(也称为注册)
        * key只关注事件,绑定的事件类型4种,
        * connect - 客户端连接成功时触发;
        * accept - 服务器端成功接受连接时触发; 
        * read - 数据可读入时触发;
        * write - 数据可写出时触发,
        * */
      SelectionKey key = channel.register(selector, 绑定事件);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    2.4、Selector监听 Channel 事件

    • 可以通过下面三种方法来监听是否有事件发生,方法的返回值代表有多少 channel 发生了事件。

    • 方法1:阻塞直到绑定事件发生

      int count = selector.select();
      
      • 1
    • 方法2:阻塞直到绑定事件发生,或是超时(时间单位为 ms)

      int count = selector.select(long timeout);
      
      • 1
    • 方法3:不会阻塞,也就是不管有没有事件,立刻返回,自己根据返回值检查是否有事件

      int count = selector.selectNow();
      
      • 1

    2.5、Selector何时不阻塞

    • 事件发生时
      (1)、客户端发起连接请求,会触发 accept 事件;
      (2)、客户端发送数据过来,客户端正常、异常关闭时,都会触发 read 事件,另外如果发送的数据大于 buffer 缓冲区,会触发多次读取事件;
      (3)、channel 可写,会触发 write 事件;
      (4)、在 linux 下 nio bug 发生时;
    • 调用 selector.wakeup()
    • 调用 selector.close()
    • selector 所在线程 interrupt
  • 相关阅读:
    2023下半年软考网管和网工考后分析!
    [LCT刷题][树链信息维护] P4332 [SHOI2014]三叉神经树
    9.11 校招 实习 内推 面经
    java毕业设计项目源代码CRM客户关系管理系统
    【PAT(甲级)】1053 Path of Equal Weight
    尚硅谷大数据项目《在线教育之实时数仓》笔记002
    什么是PDCA循环?如何整合 PDCA 循环和 OKR
    DLL和PLL
    Layui快速入门之第八节 表格渲染与属性的使用
    Java版企业电子招标采购系统源码—企业战略布局下的采购寻源
  • 原文地址:https://blog.csdn.net/li1325169021/article/details/126376096
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号