NIO中的Selector、Channel到底是什么

前言

最近又重新研究了一下Netty,里面一些关于很多名词又重新学习了一下,这些笔记仅为学习记录。这一次主要学习理解一下NIO中的Selector。

我是在NioEventLoopGroup看到此类是用Selector实现的,而Selector是基于Channel的,这个先不提。

IO和NIO

一. IO

首先我们学Java的都知道I/O,在java.io里有很多I/O类,例如读文件的时候用的FileInputStream。

1. 单向的

我们可以发现,这些IO类都是成双成对的,一个InputStream就会有一个对应OutputStream,所以我们可以得出结论:IO数据是基于流(Stream)单向传输的

2. 阻塞的

以FileInputStream的read()为例。方法描述:从输入流中读取一个字节的数据,如果没有可用的输入,这个方法将被阻塞。


也就是说,当调用read()的时候,线程被阻塞,只有读取到数据的时候,才会返回一个int。如果迟迟读取不到数据,那么线程一直会被阻塞,这个线程也干不了其他的事情。

3. 面向流

面向流意味着read()每次从流中读一个或多个字节,直至读取所有字节返回-1,没有缓存。

二. NIO

Non-blocking I/O,也称为New I/O。Buffer、Channel、Selector是NIO的三大组件。

1. 双向传输

Channel(通道)提供了双向传输的能力。程序在与文件、socket等建立了channel之后,既可以从channel里面读取数据,也可以往里面写入数据。

2. 缓冲区

NIO会将数据读取到buffer缓冲区内,基于缓冲区进行数据操作。

同时我们还可以对buffer进行一系列的操作。

3. 非阻塞的

在调用read()方法读取Channel时,当没有可读数据时,会直接返回0,而不是阻塞线程。

4. Selector

一个多路转换器,。

但是只能服务于SelectableChannel,在右侧可以看到其子类。为什么??就拿SocketChannel来说,socket分为服务端和客户端,在服务端用于接收客户端的数据。当一个客户端和服务端建立连接之后,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值