自学内容网 自学内容网

NIO三大组件关系

Java NIO 同步非阻塞模式,通过Selector选择器 使一个线程从某通道(Channel已就绪准备好数据载体),让线程不会因为阻塞没事可做

通俗理解:NIO是可以做到用一个线程来处理多个操作的.假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理.不像之前的阻塞IO那样,非得分配10000个线程

HTTP2.0使用了多路复用的技术,做到同一个线程并发处理多个请求,而且并发请求的数量比HTTP1.1打了好几个数量级.

IO是面向流处理的,NIO事实上是面向(缓冲区)Buffer块(区)处理的

数据是从 Channel 输出到 Buffer 中,或者从 Buffer 输入到 Channel 中。那么换句话说就是 数据从Channel 写入到Buffer,或者从Buffer读取到Channel  其实这句话是错误的

正确的说:

数据总是从通道读取到缓冲区,或者从缓冲区写入到通道

原因

ByteBuffer buffer = ByteBuffer.allocate(1024);

// 从 Channel 读取数据到 Buffer
int bytesRead = channel.read(buffer);

// 准备从 Buffer 读取数据
buffer.flip();

// 从 Buffer 写入数据到 Channel
int bytesWritten = channel.write(buffer);
 

NIO三大核心组件: Selector Channel Buffer

每个Channel都会对应一个Buffer

一个线程对应一个Selector,一个线程或者说一个Selector对应多个Channel

Channel需要注册到Selector

线程切换到哪个Channel是由事件决定的,Selectot会根据不同事件在各个Channel上选择,Event就是一个重要概念

Buffer就是一个内存块,底层是个数组

数据的读写是通过Buffer,注意flip()方法进行切换

Channel是双向的

读写数据都必须经过Buffer

Buffer 的双向数据传输角色

 虽然 Buffer 本身在同一时间内不是双向操作的,但它在数据传输过程中起到了双向的作用

Channel可以同时读写,但是Buffer同一时间只能读或者写


原文地址:https://blog.csdn.net/tiantiantbtb/article/details/140734475

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!