00:01
各位同学大家好,欢迎继续收看上硅谷Java n IO课程。我们刚才呢,给各位介绍了什么是letter,包括letter相关的特点,那下面呢,我们讲一下letter这个对象我们该怎么进行使用,那下面我们来具体看一下关于letter的使用方法。首先我们看第一个关于select该如何进行创建,那下面呢给各位来演示一下,咱通过代码一边说一边来写一下,创建的很简单,直接调里边的open方法就可以创建一个select的这么一个对象,那现在我在这里边把代码给各位来写一下。我在这里边先来个问方法。然后在里边咱们就创建这么一个select。那这位置我写一下啊,做法就是调用letter对象里边的这个方法,这一方法叫open方法,然后咱们调用之后就可以创建出一个select这么一个对象,这就是里边的第一个操作,各位把这个给记住,通过open方法进行select对象的创建。
01:21
然后这个说完之后,我们再看里边的第二个操作。第二个操作是呢,注册China到set上边,那怎么做呢?我们看一下啊,在这里边我们调用里边一个方法,这个方法叫reject,做到这么一个注册,然后在这过程中呢,有两点希望各位特别注意,这里边我给大家说一下,然后咱们用代码来写一下,首先第一点各位注意,这个时候呢,咱的channel必须出一个非阻塞模式,如果说你不是非阻塞模式,它会抛出异常,也就是这个时候呢,咱们的file channel就不能跟select一起使用了,因为file channel不能切换非阻塞或室中去,然后里边的第二个就是。
02:09
一个通道呢,并没有说一定要支持所有的自种操作,就是咱之前提到里边那个自动操作,并不是一个通道要支持所有自动通道,而这个时候呢,大家注意啊。咱们在这个过程中,比如说我们这个server,它支持这个接受操作。而里边的搜channel客户端支不支持里面这个操作,它可以通过通道绕这这个方法,然后来实现获取通道所支持这个操作的集合,就是里边用这个方法能看到这通道支持哪操作,这是里边的两个细节,那下面呢,我用代码给各位来演示一下怎么注册channel到C这个过程,给各位写一下啊,首先第一步咱肯定是创建一个这个。
03:00
然后第二部分呢,我们来创建这么一个通道。这里边我来创建,比如说我写一个就是这个server。Socket。等于咱们用server socket channel里边这个open方法把通道给它进行获取。然后获取之后,我们的第三部分呢,刚才提到咱们要设置这个通道是一个非阻塞的这么一种模式。那这里边我来做个设置,用server socket里面这个方法叫做config blocking,这个值咱们写成false,就表示它是一个非阻塞模式,然后这个写完之后,咱们需要在上面呢给它绑定一个连接,那我来写一下就是绑定。这么一个连接,那我们用这个server。So channel里边这个band的方法做个绑定,New上这么一个对项,比如说里边我写个999这个顿口号,这样的话我们完成一个绑定,然后绑定之后最后一步,也就是最重要的步骤,咱们现在就可以将我们这个通道。
04:17
给他注册到咱们的选择器的这个设备去,那这里边我们现在咱们来做注册,而这个过程我们就调里边这个方法最终做实现。那我们来写一下啊,用server。然后里边有个方法,这个方法就叫做ER,在它里边我们用两个参数,这个方法,第一个参数就是你那个选择器selecter,然后第二个操作就是你要进行监听那个事件,那个状态,也是你要做什么事情,然后咱们用那个select。写下啊。里边有一个。
05:01
然后里边有它的一些常量值,比如说我们这里边是一个这个接收的这么一个状态包,是连接,是读是写,那比如说咱们写一个接收的状态,所以这样的话呢,通过这个代码就完成这个把通道注册到咱们的选择器上的过程,这是我们写的里边的第二个操作。各位把这个记住,比如我刚才我提到的啊,在这过程中,第一个你的这个channel必须出一个非阻塞的模式下,然后第二个就是咱一个通道并不是一定要支持所有私种操作,咱用这个方法可以得到这个通道支持哪些操作,所以现在咱就把第二个操作完成了注册到S这个过程。然后这个做完之后,我们再看第三个操作,第三个操作咱们说什么呢?这里边比如说我现在啊,想轮询查询一下,在我这个C里边注册通道里边那些就绪的状态,比如现在我就做这个,就是已经是一个读状态,已经是一个接收状态,已经是一个写状态,那这个时候咱可以通过select里面一个方法叫select方法,可以做查询,它可以查询出已经就绪的通道操作。
06:17
而这个什么意思呢?给大家再说一下啊,其实之前解释过,比如我现在啊,在CR上边咱们注册了四个通道,四个通道分对应咱们的四种状态,那这个时候比如说我第一个通道已经达到这个,比如说一个读状态已经就绪了,那select可以查到这个状态是否就绪,所以咱们通过select里边这个方法叫select方法,就能做这个查询,而select方法中,咱们这里边就是重载了三个方法,第一个就是普通select,第二个加上一个时间,就是它的最长阻塞这个时间这个毫秒数,第三个是非阻塞,就是立刻会进行返回。而此爱的方法呢,最终反回是一个in类型,如果说一个通道变成就绪状态,那它反应值就是这个一啊,所以咱们现在用此爱的方法就可以轮循查询你通道的就绪这状态这个操作,而这里边有提到叭,如现在我们一个选择器中可能注册了多个通道,那这个时候呢,我可以查询多个通道是否已经是一个就绪状态,而这个时候在我们赛中有个方法,这个方法叫select的case方法,用来访问已经选择键的集合,就是你哪些这个通道已经是就绪状态,然后把里面这些状态可以都放到咱们这个就是集合里面去,这个集合叫选择键集合,咱通过便利可以得到里边的各个状态类型,再进行相关操作。所以下面呢,我把这段代码给各位,咱们来演示一下,让大家看一下里边的效果是怎么样的。
07:57
那下面我们来写啊这个代码。
08:00
咱们来到这里边,比如说现在啊,我这个通道在我的选择器中已经进行了注册,那在下面呢,就可以调用我们的赛的方法来查询一下,就是已经就绪的这些通道的这个操作,比如说哪些通道已经就绪了,然后这通道里边是什么操作,把这个可以得到,而这个过程中咱们可以通过这个赖的方法进行实现,但是因为我现在一个选择器中可能会有很多通道,所以把这些就绪通道操作都可以得到,然后可以放到一个选择键的集合中去,那下面我们来写一下这个代码,这里写一下啊,我们用这个select里边这个方法叫selected,这个kiss。这个方法,然后它返回的各位注意啊,是个什么,是不是一个set集合呀,就是你多个通道已经进行就绪那个操作,把这个放到一个集合里面去,然后放到集合中下面咱就可以便利这个集合,得到里边的就是你的每个这个就绪那个操作,那这里边来做个便利,这个便利多种方式,咱就用最原始这个迭代器的方式做个便利啊,加上一个这个。
09:19
返回这个特瑞这个对象,然后下面咱们来做一个便利。我们加上一个while循环,在while循环里边呢,咱用这个就是it点上哈西next,然后便利便利之后,我们这里边,比如说得到里边的每个那个就绪那个key啊,就是操作那个就绪那个操作把这个得到,那在里边我来写一下啊,通过这个就是it瑞。里边这个方法应该叫这个nice方法,那就得到里边的每个这个selection,这个key啊,就是你操作那个就绪状态的key,然后根据key呢,下面咱可以判断他的状态,然后做你不能操作啊,就是判断你K的那个就绪状态那个操作,比如说你是读的就去还是写,还是连接,还是等等其他状态,那这里边咱们可以做判断,而判断呢,我们就用if直接进行实现。
10:21
那各位写下,比如说第一个,假如我判断啊,这个K。它的状态,比如咱用这个叫is accept able啊,就是否是一个这个就是接受的这么一个状态,如果是的话,那我们做其他操作,然后在else再判断它的其他状态,那这些判断我从课件中给各位就直接复制过来了,就是里边的这些判断,我把这个给各位拿过来。然后咱们来看一下啊,首先咱看第一个就是它是不是一个接受的状态啊,这个accept的状态,如果是的话做我们操作,第二个是否是一个connect,就是连接状态,第三个是否是一个读状态,包括是否是一个写状态,如是的话,那我们进行咱们相应的这些操作,所以现在我们就把这么一个基本结构我们就写出来了,然后写完之后,最后啊,咱们可以把这个就是瑞给它做一个remove啊,就是remove这么一个操作。
11:20
啊,最后这个。所以现在呢,我们就完成了里边的第三个操作,就是刚才我提到的轮询查询你就绪状态的操作,也就是通过select查询,在sirr里边注册这个通道里面那个就绪通道那个操作,比如说这个已经就绪了,把它查出来,这个就绪了把查出来,这过程中咱可以把所有就绪那个操作放到一个选择键集合中去,然后通过便利方式得到它具体的一个状态操作,再实现咱们的对应的这个功能啊,所以现在这个过程咱就完成了,就是中的第三个操作,这各位给他记住。
12:00
然后这个说完之后呢,在中还有最后一个操作,就是停止选择的方法,那这个什么意思呢?给各位来说一下这个过程啊。比如说现在呢,我们选择器在执行选择的过程中,而系统底层会依次询问每个通道是否已经就绪了,这咱刚才提到,比如现在我有十个通道在R里面进行注册,那我要挨个去询问,看你这些通道是不是经就绪,而这个过程中呢,就是可能会造成啊,你线程进行一个阻塞的状态,而这个时候咱可以通过一个方法。进行这个线程一个唤醒的,就唤醒这个里边这个阻塞的线程,把它做唤醒,那这过程怎么做呢?在里边有一个方法,这个方法叫wakeup wakeup什么意思呢?就是通过set对象中的up方法,可以把处在阻塞状态set方法立即给它做返回,就做一个唤醒操作,这各位给他知道一下,然后除了这个之外,还一个方法叫可漏的方法,这方应该好理解,就是通过这个方法能关闭这个select。
13:08
就是关闭之后啊,那这里边各位注意啊,这里我提到该方法使任何一个选择操作中的阻侧线程被唤醒,类似于我发,同时就是使你注册到S里边的所有这个channel被注销,但是注意啊,这里边只是所有这个channel这个键被注销,但是China本身并不会进行关闭,也就是说现在啊,我把这个在里边掉壳的方法,那这时候China在里面就没有注册了,这过程就没了,但是channel本身并没有做到关闭啊,所以这时候我们提到的最后两个方法就是停止选择方法,一个叫wakeup,一个叫close。啊,所以现在咱就把set选择器中几个方法给各位分别做个说明,最后再重复一遍啊,第一个方法创建用open方法,第二个注册用这个,然后第三个就是做操作,咱们用这个set case,然后便利实现,最后一个包括唤醒wakeup,包括关闭close,所以现在里边的方法给各位就介绍到这里。
我来说两句