00:01
各位上硅谷的朋友们大家好,欢迎继续收看上硅谷Java n IO课程,咱们继续往下进行学习。在前面内容中的咱们分别讲到了China通道,Buffer缓冲区,那下面呢,我们来讲一下NIO中的第三个重要的概念,Select选择器,咱我们来具体看一下关于选择器中的行为内容。首先呢,我们先说一下什么是选择器,咱们从四个方面来讲解,首先我们看第一个方面就是select和China,它们之间到底有什么关系,那我们来看一下啊里面这个相关的特点。Select呢?我们一般称为叫选择器,也可以翻译成叫多路复用器,它是Java IO中一个核心的组件,而它是做什么的呢?给各位说一下,它用于检查一个或者多个通道的状态,是否处于可读和写等状态,也就是说它可以用单线程来管理多个拆用通道,或者说是管理多个网络链接。然后大家看这张图道。
01:18
比如现在我这里边有一个select选择器,下面是不有很多通道,我这些通道在select中进行注册,然后我通过一个select就能去管理多个通道,这就是他们之间关系,Selecter和China关系。而使用selecter的好处是什么呢?我们可以用更少的线程去管理通道,而相对于我们之前的方式,一个操作对应一个线程,它可以避免咱们上下文千万中带来的这种消耗。所以这是关于我们说的第一个特点,S selecter和开的关系,也就是说通过一个ser去检查多个通道里边的状态,是否处于可读可写等状态,进行相关的操作,这是我们说的第一个特点。
02:08
然后这个说完之后呢,我们再看第二个新闻概念,叫做可选的通道,叫select able channel,那这个什么意思呢?给各位说一下啊,也就是说呢,大家要知道,并不是所有的channel通道都可以s letter复用,比如说咱的file channel就不能被选择器所复用,那为什么呢?这里强调啊,有这么一个特点。判断一个China是否能被set复用,就是要看一下啊,这个China是否继承了一个类,这个类叫set China,如果继承的那就能被settle,这个settle给它复用,如果没有继承就不能,而set able China里边提供了实现通道可选择性所需要的各种共方法,所以咱们现在啊,我们这里边,比如说咱之前里边那个soet通道基本上都继承了s China,所以它可以被我们的。
03:10
Select所附用,但是fair China这个类,因为它没有继承able这个这个类,所以它不能被这个所复用,所以这是它的特点,各位把这个记住啊,也就是说你的这个China需要继承set able China才能被select所复用,如果没有继承,那就不能被他复用。这是咱说的第二个,而这里提到啊,就是一个通道可以注册到多个选择器上,但是我们每个选择器而言,它只能被注册一次,通道和选择关系就是使用注册方式进行完成的,比如各位看这张图上,咱这里边有三个通道,而我三个通道在中进行注册,通过set就能管理里边的六个通道。
04:02
而able China可以备注到对象中,在注册的时候需要指定通道,里面的哪些操作是set感兴趣的?什么意思呢?给大家说的具体点啊,比如现在我这里面有三个通道。比如说我现在啊,What's at只关心第一个通道是否可读,只关第二个通道是否可写,就是注册他感兴趣这个事情,比如这里边,当我这里边处于可读状态,那set性操作,它处于可写状态,那通过set性操作,所以这是第二概念,叫做可选择通道set able channel,各位把这个特点记住,你要知道什么样的通道可以被所复用。这个我们做这个说明,然后这个说完之后呢,我们再看第三个,就这个China怎么注册到C中去。包括他感兴趣这个东西到底有哪些,那我们来看一下啊,我这里写到其实很简单,调用channel中的这个方法叫就可以完成这么一个注册,而在这个方法中两个参数,第一个参数就是你要注册那个选择器,第二个就是选择器需要查询多到操作,也就是咱们感兴趣的事情是什么,这是里边的两个参数。
05:20
然后两个参数中呢,咱们看第二项,因为第一个好理解,就是你的选择器,第二个指的是选择器需要查询通道的操作,这些操作呢,咱们从类型来分,分成以下四种操作,第一个可读,第二个可写,第三个连接,第四个我们叫接收,而这里边咱们可以通过这个完成C,他感兴趣的是这个操作。但是注意啊,如果说我这个select呢,最通道里边的多个操作类型都感兴趣,咱可以用这个未获,就是这个竖线这个操作来实现,比如说你看我这里边他就对这个读包括写都感兴趣,所以用这个符号我们来表示,这是我们提到的里边这个特点,而选择去查询。大家注意啊,它并不是通道的操作,而是通道的某个操作是一种就绪的一种状态,就好比说我现在比如说我都准备好了,告诉你我已经准备好了,你可以马上进行这个操作,比如问你,你是否准备好接收我这个踢过来的球,我准备好了,那我把球就踢给你啊,所以他指的是这个过程并不是你的操作,而是操作的一种就绪的状态,已经准备好了。
06:37
而这过程呢,就比如说我现在啊,我某个消费通道可以连接到一个服务器,那目前处一个连接就绪状态,马上可以进行连接,或者说我这个通道目前处于一个接收状态,就接收就绪状态,或者说我目前处于一个读的就绪,或者出一个写的就绪,就可以马上进行这个操作了。所以这是关于我们提到的第三个China如何注册到select上面去,各位记住用方法,第一个是选择器,第二个是你查询通道的一些操作,包含四个可读可写连接,还有这个接收。
07:18
所以这个我们做了一个说明,然后说完之后呢,还有最后这么一个特点。最后是什么呢?就是China啊,注册之后一旦通道处于某种就绪状态,那它就可以被小量器查询到,而这个工作呢,咱可以通过选择器里面这个赖的方法进行完成,这个方法作用是什么呢?对感性的通道进行操作,进行就绪状态的查询,比如说刚才我提到的啊,假如说我现在这里边注册是我这个读的状态,当我查询发现它已经出一个读就绪状态,那我们进行操作,假如现在我注册这个通道是一个写状态,当我调散方法查询它是一个写就绪状态,那我们进行我们这个操作,所以里边就是这么一个解释。
08:08
比如这里提到的。莱可以不断的查询channel中发生操作的就绪状态,并且挑选感兴趣的操作注绪状态,一旦头脑中就绪状态达成,它里边就对感兴趣那个操作解决,我们后续的这个过程就是刚才我们提到的啊,而这里边大家注意啊,就是。Select选中之后,它会把里边选中一些东西放到一个叫选择键的即合中去,比如说我现在提到一个是不是能够进行多个通道注册,而多个通道中,比如现在都处于一个就绪状态,那他把里面这些东西就放到一个叫选择键的这个集合中去,在里边做存储,就存储你的各种状态,比如你是可读可写,是读就去,写就去,还是接收等等状态,而这里边就是一个选择键,可以包含住在R里边通道操作的类型,比如说这个读等等这个状态。
09:10
而咱关键其实就是啊,开发这个就是里边这个选择键的过程,通过它来实现咱们不同的这个业务,而选择键的概念呢,其实各位可以理解啊,就类似于咱们那个事件的概念,跟它有点类似,比如说举个例子啊,比如咱事件我单击是不是一个事件,双击是不是一个事件,包括我改变是不是一个称值事件,只说selecter跟它的不同是什么呢?事件咱需要用触发模式,而这里边选择件需要咱们主动去查询模式,这个是不一样的,但是跟事件是很类似的,也就是说我去查询我的通道,发现通道是我关心的状态,这种情况那里边做操作,比如现在我查询它是一个读就去,它是写就去,它是什么接收就去等等,那咱们进行咱们的后续操作,所以这些就是关于select一个基本概念说明。
10:07
通过我的介绍,大家至少记住这么几个,第一个你知道select跟China什么关系,第二个什么通道可以进行select的复用,第三个各位知道China怎么注册到在里面去,包括里边有哪些查询的通道操作,还有最后一个什么叫选择键。所以这是关于我们说的第一个概念的基本介绍。
我来说两句