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的视频,则影像画面将不能正常显示.下 ...
随机推荐
- Zenefits CodeSprint:Knight or Knave
题意是一堆人,从1到n编号,每个人i说一句话,x.x是正数表示i说x君是个好人,x是负数表示i说x君是坏人.问这个群体中最多能有多少好人,把这种情况用字典序的方式输出(好人用A表示,坏人用B表示),希 ...
- Spark教程——(7)编写spark-sql程序读取HBase定时生成报表
plugin划红线报错: maven-scala-plugin maven-shade-plugin 查找Maven仓库,发现一个没有jar包,一个jar包无法解压缩打开,删除Maven中坏的jar包 ...
- Vue -> 解决 vue-ueditor-wrap 不能显示的问题
- for循环语句及批量创建用户!
1.for 语句结构for 变量名 in 取值列表do命令序列done ================================================================ ...
- kafka控制测试发送接收消息
kafaka,生产者:./kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic 消费者:./kafka-co ...
- 「luogu2617」Dynamic Rankings
「luogu2617」Dynamic Rankings 传送门 树套树直接上树状数组套主席树,常数很大就是了. 树套树参考代码: /*-------------------------------- ...
- C语言笔记 14_标准库&assert&ctype&errno&float&limits
C 标准库 <assert.h> 简介 C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息. 已定义的宏 ass ...
- 通过修改select的value值
1 <input type="button" id="btn" value="按钮"/> 2 <select name=& ...
- Java知识总结:Java反射机制(用实例理解)
概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...
- CXL联盟正式成立:成员均是行业巨头
导读 今天,阿里巴巴.思科.戴尔EMC.Facebook.Google.HPE.华为.Intel.微软(按英文首字母排序)联合宣布,CXL联盟(Compute Express Link Consort ...