NIO三大组件之Selector选择器】的更多相关文章

什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selector --选择器类 selector.open() --获取Selector实例 SelectionKey --选择键类,包含被选中的I/O事件及各种属性(通道,状态....) 可监控类型 (1)可读:SelectionKey.OP_READ (2)可写:SelectionKey.OP_WRITE…
NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性, 使用它可以提供非阻塞式的高伸缩性网络. NIO的非阻塞模式, 当使用一个线程从某通道发送请求或读取数据, 但它仅能得到目前可用的数据, 如果目前没有数据可用时, 就什么都不会获取, 而不是保持线程阻塞, 所以直至数据变的key读取之前, 该线程可用继续做其他事情. 非阻塞模式同理, 一个线程请求…
NIO 概述 NIO有三个核心组件: 通道(Channels) 缓存(Buffers) 选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心.至于其它组件,例如Pipe和FileLock只不过是围绕在三大核心组件旁的实用工具类.因此,本文将重点关注这三个组件.其它组件也会在本系列其它相应的文章里介绍. 通道和缓存 在NIO里,所有IO都是从通道开始的.通道和流有点相似,可以将数据从通道读入缓存,也可以将数据从缓存写入通道,图示如下: 通道和缓存都有多种类型,下…
本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件.connect连接完成事件.read读事件.write写事件),从阻塞状态返回就绪的Channel的SelectionKey集合,之后进行IO操作. Channel:封装了socket. ServerSocketChannel:封装了ServerSocket,用于accept客户端连接请求: SocketC…
NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类型外,其余基本类型都含有. NIO中定义的抽象缓冲区对象如下(均继承至Buffer抽象类): ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer 上述类均为抽象类,它们的实现还分有直接缓冲区和…
Java NIO 之 Channel 一.什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作. 在Java NIO中负责缓冲区中数据的传输.Channel本省不存储数据,因此需要配合缓冲区进行传输.(个人理解其实就是相当于保存两通信地间的上写问和进行读写操作,相当于邮局) 二.通道的主要实现类 java.nio.channels.Channel接口: FileChannel(本地) SocketChannel(TCP) Ser…
什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和读取的交替访问 Buffer类的特性 线程安全性 Buffer是线程不安全的,所以如果有多于一个线程去访问,那么需要手动加上同步操作 关键属性 capacity 是Buffer对象的能容纳的最大的元素个数(类似于数组的长度,但不一定是字节数组),不能为负,不能改变 limit 是第一个不能够被读或者…
1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层 常见的 Channel 有 FileChannel DatagramChannel SocketChannel ServerSocketChannel 2. Buffer buffer 用来缓冲读写数据,常见的 b…
简介 使用Selector(选择器), 可以使用一个线程处理多个客户端连接. Selector 能够检测多个注册的通道上是否有事件发生(多个Channel以事件的方式可以注册到同一个Selector), 如果有事件发生, 便获取事件然后针对每个事件进行相应的处理.这样就可以只用一个单线程去管理多个通道, 也就是管理多个连接和请求. 只有在连接有读写事件发生时, 才会进行续写, 就大大地减少了系统开销, 并且不必为每个连接都创建一个线程, 不用去维护多个线程. 避免了多线程之间的上下文切换导致的开…
深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果你真的是入门而且不常阅读这种文字教程可能会看不懂,我的锅,别担心,建议找点简单的视频教程什么的先看看) 第二个部分为Tomcat中对NIO的应用(本篇虽然讲Tomcat源码,但是主要讲其中NIO的部分,其他部分请移步)(如果对NIO简单使用有把握的话可以直接先看这篇) 第三个部分为NIO原理及部分源…