NIO三大组件简介
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三大组件简介的更多相关文章
- NIO - 三大组件
NIO 概述 NIO有三个核心组件: 通道(Channels) 缓存(Buffers) 选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心.至于其它组件,例如Pi ...
- 第一章 java nio三大组件与使用姿势
本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...
- Java NIO 三大组件之 Buffer
NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...
- Java NIO 三大组件之 Channel
Java NIO 之 Channel 一.什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作. 在Java NIO中负责缓冲区中数 ...
- NIO三大组件之Buffer
什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...
- NIO三大组件之Selector选择器
什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...
- Netty学习笔记(1)NIO三大组件
1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...
- 深入理解NIO(一)—— NIO的简单使用及其三大组件介绍
深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果 ...
- NTSC、PAL、SECAM三大制式简介
NTSC.PAL.SECAM三大制式简介 NTSC.PAL和SECAM是全球三大主要的电视广播制式,这三种制式是不能互相兼容的,例如在PAL制式的电视上播放NTSC的视频,则影像画面将不能正常显示.下 ...
随机推荐
- 内核运行时数据结构的操作(启用路由功能),sysctl内核设置命令
LINUX系统运行时,内核数据结构数据的修改,系统提供了统一抽象的文件操作接口(命名空间操作接口)比如启用路由功能echo 1 > proc/sys/net/ipv4/ip-forward// ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- LeetCode 21. Merge Two Sorted Lists(合并两个有序链表)
题意:合并两个有序链表 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next ...
- DoMes平台首页菜单栏
问题1:左侧菜单栏数据是在哪里获取的? 答案1: 项目根目录的Views/Home/Index文件为平台首页 打开Index.cshtml文件,有一个framework-clientdata.js引入 ...
- Groovy轻松入门——通过与Java的比较,迅速掌握Groovy
转自 :Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18) 在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了 ...
- 延迟加载以及mybatis一级二级缓存
延迟加载 延迟加载:在真正使用数据时才发起查询,不用的时候不查询,又叫按需查询(懒加载) 立即加载:不管用不用,只要调用方法,直接发起查询 表关系:一对多 多对一 一对一 ...
- Oracle 提取数据表信息
参考: https://www.progress.com/blogs/jdbc-tutorial-extracting-database-metadata-via-jdbc-driver http:/ ...
- 多个span标签在同一行显示
属性设置为display:inline或display:inline-block
- 第1节 kafka消息队列:3、4、kafka的安装以及命令行的管理使用
6.kafka的安装 5.1三台机器安装zookeeper 注意:安装zookeeper之前一定要确保三台机器时钟同步 */1 * * * * /usr/sbin/ntpdate us.pool.nt ...
- 二、spring集成ibatis进行数据源事务管理拦截器环境配置
1.dataSource-applicationContext.xml文件配置理解:(spring1.2.8+ibatis1.5.3)1.1)配置数据源 DriverManagerDataSource ...