NIO简介

  • NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块。数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性, 使用它可以提供非阻塞式的高伸缩性网络。
  • NIO的非阻塞模式, 当使用一个线程从某通道发送请求或读取数据, 但它仅能得到目前可用的数据, 如果目前没有数据可用时, 就什么都不会获取, 而不是保持线程阻塞, 所以直至数据变的key读取之前, 该线程可用继续做其他事情。
  • 非阻塞模式同理, 一个线程请求写入一些数据到某通道, 但不需要等待它完全写入, 该线程就可以去干别的事情了。
  • 核心理解: 用一个线程来处理多个操作, 不用像BIO那样必须一个线程处理一个操作, 减少了cpu资源调度的损耗。
  • 此外需要注意的是: HTTP2.0 使用了多路复用的技术, 做到了使用同一个连接并发处理多个请求, 而且并发请求的数量比HTTP1.1大了好几个数量级。

三大组件

  • Buffer(缓冲区)

    • 值得注意的是没有BooleanBuffer哈
  • Channel(管道)

    • 本身是一个接口

      • 继承该接口的接口有:

        • ReadableByteChannel(可读的字节数组管道)
        • InterruptibleChannel(可中断的管道)
        • NetworkChannel(网络管道)
        • WritableByteChannel(可写的字节数组管道)
        • SelChImpl(Select Change Implements?接口注释写的是一个允许转换(甚至更多)的接口, 暂时不去细看了)
        • AsynchronousChannel(异步管道)
      • 实现了该接口的类有:
  • Selector(选择器)

    • 本质是一个抽象类

      • Selector <- AbstractSelector(抽象选择器) <- SelectorImpl(这其实还是个抽象类) <- WindowsSelectorImpl(窗口选择器实现类)

三者的关系

  • 每个channel 都会对应一个Buffer
  • Selector 对应一个线程, 该线程对应多个channel(管道)
  • 上图表示有三个channel注册到了此selector程序
  • 程序切换到哪个channel是由事件(Event)决定的
  • Selector 会根据不同的事件, 在各个通道上切换
  • Buffer本质上就是一个内存块, 底层有一个数组, 数据存放于其中
  • 数据的读取写入是通过Buffer的, 此点与BIO有本质区别(BIO中要么是输入流, 要么是输出流, 不能双向传输)
  • NIO 的Buffer可以读也可以写, 但是需要flip()方法切换
  • channel 是双向的, 可以返回底层操作系统的情况, 如Linux底层的操作系统通道就是双向的

NIO三大组件简介的更多相关文章

  1. NIO - 三大组件

    NIO 概述 NIO有三个核心组件: 通道(Channels) 缓存(Buffers) 选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心.至于其它组件,例如Pi ...

  2. 第一章 java nio三大组件与使用姿势

    本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...

  3. Java NIO 三大组件之 Buffer

    NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...

  4. Java NIO 三大组件之 Channel

    Java NIO 之 Channel 一.什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作. 在Java NIO中负责缓冲区中数 ...

  5. NIO三大组件之Buffer

    什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...

  6. NIO三大组件之Selector选择器

    什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...

  7. Netty学习笔记(1)NIO三大组件

    1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...

  8. 深入理解NIO(一)—— NIO的简单使用及其三大组件介绍

    深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果 ...

  9. NTSC、PAL、SECAM三大制式简介

    NTSC.PAL.SECAM三大制式简介 NTSC.PAL和SECAM是全球三大主要的电视广播制式,这三种制式是不能互相兼容的,例如在PAL制式的电视上播放NTSC的视频,则影像画面将不能正常显示.下 ...

随机推荐

  1. 内核运行时数据结构的操作(启用路由功能),sysctl内核设置命令

    LINUX系统运行时,内核数据结构数据的修改,系统提供了统一抽象的文件操作接口(命名空间操作接口)比如启用路由功能echo  1 > proc/sys/net/ipv4/ip-forward// ...

  2. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)

    上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑

  3. LeetCode 21. Merge Two Sorted Lists(合并两个有序链表)

    题意:合并两个有序链表 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next ...

  4. DoMes平台首页菜单栏

    问题1:左侧菜单栏数据是在哪里获取的? 答案1: 项目根目录的Views/Home/Index文件为平台首页 打开Index.cshtml文件,有一个framework-clientdata.js引入 ...

  5. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy

    转自 :Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18) 在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了 ...

  6. 延迟加载以及mybatis一级二级缓存

    延迟加载 延迟加载:在真正使用数据时才发起查询,不用的时候不查询,又叫按需查询(懒加载) 立即加载:不管用不用,只要调用方法,直接发起查询 表关系:一对多     多对一     一对一        ...

  7. Oracle 提取数据表信息

    参考: https://www.progress.com/blogs/jdbc-tutorial-extracting-database-metadata-via-jdbc-driver http:/ ...

  8. 多个span标签在同一行显示

    属性设置为display:inline或display:inline-block

  9. 第1节 kafka消息队列:3、4、kafka的安装以及命令行的管理使用

    6.kafka的安装 5.1三台机器安装zookeeper 注意:安装zookeeper之前一定要确保三台机器时钟同步 */1 * * * * /usr/sbin/ntpdate us.pool.nt ...

  10. 二、spring集成ibatis进行数据源事务管理拦截器环境配置

    1.dataSource-applicationContext.xml文件配置理解:(spring1.2.8+ibatis1.5.3)1.1)配置数据源 DriverManagerDataSource ...