00:01
看一下select类的相关的方法。首先我们先看一下select呢,它是我们整个NIO编程里面非常重要的一个核心组件,它首先呢?呃,首先我们要明白它是一个抽象类,那既然是抽象类,我们就需要去看一下它的相关的子类有哪些,以及它的一些重要的方法,首先看它的原型是这样的。Select呢,它继承啊,它实现了这样一个接口,对不对,里面有哪些方法呢?Open这个open呢,就是得到一个选择其对象,你可以认为就是通过open啊,我们可以拿到或者说创建选择其对象实例,然后这边有个select。这个select呢,呃有呃,这个select方法呀,它是一个重载的。呃,有什么呢?可以传一个timeout,也可以不传,如果是传一个值进去呢,它表示监控所有注册的通道。
01:04
当其中有IO操作的时候,就是有读写的时候呢?呃,进行的时候将什么呢?将对应的selection k加入到内部集合中并返回。参数用来设置超时时间,我相信这几句话大家理解起来是有一定呃难度的,那这样子我们呢,来看一下select它的在它的源码是大概是什么样子的。走一个。看一下。我们来看select。点进去了啊大看这里。S类它是一个抽象类往上拉。对,那可以看到这里。对吧,它是一个抽象类,我们看一下它的继承关系。从这里看呢,它下面有一有实限指类就select,呃,Implement我们点进去看一下abstract里面有什么东西啊,大家看这里点进去。
02:11
点进去过后呢,我们打开这边它的一个结构,同学们看这里。对呃,看这边呢,我们再往下面看一个吧,看实现,诶这个看着就比较清晰了,来看你这边有一个select implement这个子类,这个子类大家有没有发现里面有很多selection。放select select selection k的这种集合比赛集合。对,那这些select select key是干什么的呢?它是这样子的,我简单的给同学们用这个图解的方式说一下,他是这样子的,同学们听我讲。我们以这个图为例啊,我们以这个图为例,这个select呢,它其实是这样子的,就是他在这里面不停的等待,就select。
03:02
他这有个set方法,这个方法呢,它会监监听哦,或者是就说在这里不停的监听,是由哪一个通道注册到,因为通这些通道呢,首先先要注册到他管理的这些通道,先要注册到这个select select上面去。然后呢,我们调用set方法就可以获取到当前有哪些注册的通道里面有事件发生。对,有事件发生,那么有事件发生过后呢,他就会干什么,大家看,一旦有事情发生,他就会。将啊将什么呢?将对应的selection,呃,K加入到内部集合中并返回,那这个内部集合就selection k,它是放在哪里的呢?就是放在咱们这些集合里边的。哦,放在这个集合里边的,那放在这个集合里面,这个sal k它有什么用处呢。
04:00
就是刚才老师不是讲了吗?只要我们这一个同学们注意听。注意听这里面还是画这个图,就是一旦你这个,呃,就是他监控到哪一个channel里,Channel里面有事情发生了,他就会把这个selection k拿到我简写啊selection k。大到。这个sal k呢,拿到以后,我们就可以去便利,就是在他这个服务器里边可以去遍利我得到的所有的select k,然后通过这个selection k呢,再去反向得到这个channel。OK,也就是说你可以理解成select k,就是跟我们这个channel关联的。对,就是关联的,诶我们拿到33K过后呢,就可以反向获取到这个channel,何以为证呢?我们还是看源代码这个,现在这个听起来有点理论,同学们听起来可能有点不太明白哈,但是你还是听一听吧,后面呢,我们举例还会说他的,大家看这个SK呢,同学们注意观察到它,这里面有一个非常重要的方法叫channel。
05:13
大家可以看到没有,而且返回的返回的类型是select Apple channel,就是可选择的channel,或说的再明白一点呢,嗯,就是就是这个channel,就是你这个sell case跟哪个channel呃关联起来的,他就会。再通过,呃,在服务器这边呢,他会反向通过获取的SK拿到这个channel再操作,呃说也就是说他的流程是这样子的啊,听我再说最后一次就是说select这个选择器呢,它是跟我们这一个线程关联的。对吧,好,然后呢,一旦关联过后这个select呢,调用这个select方法。这个方法呢,一旦返回就会返回一个集合,返回怎样一个集合呢?同学们,它返回的集合就是一个叫selection。
06:09
K的一个集合。但是这就意味着这个集合里面会有很多的3K。那这个3K呢,我们就可以通过三去看到底你是哪个事件发生了。就是你是读的事件发生了呢,还是写的事件发生了呢,还是一个连接的except的一个事件发生了呢?好,然后我就根据你你获取到的不同的事件去操作,而在操作的时候呢,我把这个,因为这个K是不是我已经拿到了,再通过这个K。取到它对应的这个channel在操作。明白了吧,大致的一个意思就是这样的一个意思,后面呢,我们会用代码来进行一个体现,大家先听到这儿。大家先听到这儿,所以说呃,同学们刚才也看到了,通过这个SK呢,可以反向再获取到它关内的channel。
07:01
诶,就这意思,你看这边还有selected k,那这个地方又不一样了,大家有没有发现select select这个方法我们再来看一下,稍等片刻,我们再看select方法是干什么事情来走一个。好的,我们看一下select里面的这个重要的方法叫select。这个方法是干什么呢?来看一下,看他的说明。他说这个方法呢,它执行一个blocking的,就是一个主色的selection操作,诶这有点郁闷了,有些同学老师你你们你讲咱们讲的,咱们讲的这个NIO不是非主塞的吗?你怎么又说它是主塞的,不是很矛盾吗?是这样子啊同学们,如果你调的是select这个方法,它是一个阻塞的,就是直到什么时候才会返回呢?就是直到他,嗯,直到我们这个通道,就是他不是s select一直在监听吗?调这个S监听他直到我们这一个s select关,嗯,关联的,或者说注册的。
08:10
SECSCL。SE啊,这个地方写起来,这个这个笔写起来特别难受,好就是他在这地方调这个select方法监听,如果你调的是select方法后面没有带带参数呢,它就是一个主色的blocking的方法,它会直到什么时候才会返回呢?知道他注册的这个China里面至少获取到了一个。至少获取到一个事件,如果你这里面它关联的每一个通道都没发生事件,它就它就会阻塞在这里。但直到什么,直到他注册的这些China里面有至少有一个China发生了他关心的事件,他才会返回,所以说这个方法呢,的确是一个blocking的方法。那有些同学就郁闷了,说老师,那这个NIO非阻塞在哪里体现呢?大家看它还有一个方法叫做selection,这个填参数,这个参数呢,同学们看。
09:07
这个参数呢,它可以指定超时时间,比如说我在调这个,通过这个select方法select。哦,这个方法调这个select方法是我传了一个2000。那就意味着什么呢?我在这里最多阻塞2000毫秒,即使没有没有监听到任何事件发生,我也会返回。那还有一个方法叫做second闹,这个方法呢,大家再来看他是怎么说的啊,他说。他说这样子的,他说这个方法执行一个非主色的selection option,这个方法就是什么意思呢?就是它其实也是要呃达到一个相同的目的,也是监听,但是呢,他是去获取一下,如果现在拿没有得到,呃,这个有有事件发生,他就立马返回。
10:03
他就立马返回,所以说这几点呢,大家注意一下就行了,待会我有一个整理哈,所以说这写的是这个意思,那我们再来看下面还有一个方法叫selected k。Select k和这个select有什么方法,有什么区别呢?这个这个同学们注意听一下,Select呢是方法是是处于在监听的时候获取到。这个select k就是就是那个China,呃,关联的select k,但是select k呢,是从内部集合中得到所有的SK。对,也就是说,嗯,就是你只要是注册到我这个select上面的呢,我都给你返回,而select呢,它是只返回现在有事件发生的这个这个通道的select selection k明白了吧?好,大致说到这里,相信同学们应该清晰了哈,没关系,你这听你这有点晕,有点弧度也是很正常的,待会呢,我们用案例说话。
11:04
好,我们再来看S有几个注意事项,第一个呢,在ni中,Ni IO编程里面有个server socket channel这个功能呢,类似于我们Java IO的server socket,前面已经说过了,而socket China这个功能呢,类Java IO的so socket China,这个念来念去,我念的有点不利索了啊,这个你不相信,你来念一下,你念久了过后你你的这个舌头也也要打也也也要打转。Select相关的方法有哪些呢?刚才讲的第一个select,这是阻塞方法,它必须返回,至少有一个事件发生,就是他注册在select上面的参,至少有一个事件发生,它才会,它才会返回,否则他就阻塞,而select里面,Select后面带了一个值,就是按毫秒传的,它会阻塞1000毫秒及一秒。对,如果在一秒之中,一秒内他还是没有得到呃,关注的事件,或者事件发生,他也会返回。
12:02
啊,返回就是一个零嘛,相当于说呃,我得到的相关事件就是个零,还有一个方法呢,就是wakeup,这个wakeup呢是呃,它是它是这样子的,就是假如我们这个S一直在这阻塞你,你传的时间很长,比如是这么多秒三啊,这么多这么多毫秒,相当于30秒,30秒呢一直在这阻塞你,你在某个时方,你想唤醒唤醒它,你可以调select select wakeup这样呢,它也就立马返回,还有一个方法叫select no,这个no呢,它是不阻塞的,就是真正的非阻塞。啊,真正的非主,他他就是说,呃,我我去看监监听一下,看看有没有,如果没有我马上就返回。啊,OK,好的,这就是我们所说的select的大致的一个意思,这里面最重要的是要明白哪里点第1.select,它调用select这个,呃。选择器它是怎么创建起来的,它是通过一个open的方式得到的,还有一个S,这个S方法它是干什么呢?它其实是在嗯去监听,直到呃监听,直到我们这个关注的参照上有事件发生,它就会返回,返回,返回完了过后呢,他就会立即把这个对应的SK加入到内部集合。
13:18
加不到内部几个,你然后就可以去得到了好,然后就可以得到了好,这是S方法,我们就说到这,下面呢,我们就去,待会我们我们就再说一下,用图解的方式再说一下他的一个关系,再举例说明,好这讲先这讲先说到这。
我来说两句