00:01
Java的NIO编程。讲完了bio,编程也做了回顾,下面我们看一下javao,我们先对Java的IO呢做基本介绍。Java IO全称叫Java blocking IO,所以说它是一个非阻塞的IO。是指JDK提供新的API,是从JDK1.4开始,Java提供了一系列改进输入输出的新特性,所以说有些人呢,也把这个NIO叫做6IO,六这个N,你看这个N对不对,对应这个N,当然了,有些人呢,认为这个N呢,又对应这个诺,这个N其实都可以。反正呢,它是一个在原生的JDKJDK提供的IO基础上进行的一个改进。它是一个同步非阻塞的。待会儿呢,我们在案例里面会体现出它的非阻塞的特点。
01:03
NIO相关的类是放在java.nio这个包下面及其纸包,也就是说这些包下边后面我们在写代码的时候呢,会用到其中相关的类,还有接口。对,一会儿呢,我们会写一个基本案例,在NIO里面呢,有三个特别重要的核心组件,一个叫通道channel通道,这个通道呢,你可以简单的理解成就是我们bio里面的那一个什么呢?Socket。好,就是我们那个socket。待会儿我们会看到这个东西啊,Buffer呢,它是一个缓冲区。待会呢,我们在举案例的时候,还会说到它select是不是在前面我们已经讲过这个东西了,那有些同学说说老师,那你这个NIO3大核心组件,你在前面说了一个select。那么channel还有这个buffer怎么去理解呢?还是老规矩,我们用一个图来给大家做一个呃,形象的说明,打开。
02:03
这个图我们还在这个图上做一个改进,我们前面画的NIO模型呢,相对比较简单,在这里大家可以看到只是出现了它的一个核心组件叫select,那么channel还有它的buffer在哪里出现呢?来,我们对这个做一个改进。它其实呢,可以这样理解啊,同学们,我们知道全翻译过来就是通道的意思,什么通道呀,数据通道。对不对,那数据通道在一个图里面,如果比较形象的来说明呢,你可以这样理解,就好像咱们这块呢。有一个管道。明白哈,有一个管道。OK,那我为了好看呢,我们换一个别的颜色好不好?换一个这样的颜色吧。这是个管道,叫channel。呃,就翻译成中文就是通道。那翻译成我们这个英文的channel。
03:01
OK,我就画成这个样子,那么这个通道它是怎么来使用的呢?大家可以看到。Select呢,它可以根据每个通道的事件来选择哪一个通道为哪个通道进行服务,那当然这个通道可以干什么呢?可以通过这个通道仍然完成我们读写的任务。也就是说我们的数据呢,对,可以向这个通道里面写,也可以从通道读取数据,但是他这个NIO在读取数据的时候呢,它是这样读取的,同学们看到一般来讲哈,我们就是每一个通道它会对应一个八份。哦,对应buffer,比如说我们以客户端为例,这有个buffer,我们换另外一个颜色,好吧,换成绿色,对这个呢,我们叫做缓冲区。叫buffer吧,有间隙buffer。那么每一个通道都会对应一个buffer,我们的数据会怎么做呢?这个通道和buffer之间呢,它是一个双向的,也就是说。
04:08
你可以,嗯,我们画这个图。对,我们画这样一个标线吧。那一个双向箭头在哪找得到呢?大家看看这里哈,就是我们。我们这个通道呢,它既可以就是我们buffer可以把数据往通道里面去啊,写进去通道就是。我们我们这个buffer和通道之间呢,它是可以相互读写的。就这个意思,那程序注意看程序呢,同学们看我们客户端这说的再直接一点,其实它是一段程序。将来这个程序呢,注意听这个程序它不会这样去读取,也就是说它不会直接对我们这个通道进行。
05:00
读写。不会这样子的,它总是怎么样呢?它总是跟这个buffer进行交进行交互,也就是说我的程序呢,对要写入或者读取数据的时候呢,我是往这个buffer里面写,或者从buffer里面读,而buffer呢,它跟这个通道之间,就是相当于说通道和程序之间有一个缓冲,就这个意思。Buffer和我们这个通道之间也是可以相互读写的。OK,这样子呢,大家看一下,在这个图里面我们就展现出了select。通道还有buff分对不对,好的。那当然这边呢,也是一样的了,我就不去画了啊,也也就是说我们在实际的NIO模型里面呢,它相对。出现的这个组件,组件全一点的,就这样子的,Select可以选择一个通道,通道它可以跟barber进行数据的一个交互。
06:03
而我们的程序呢,它不再跟通道,也就是呃,这个通道不是原先就是有点类似于我们一个连接吗?对不对,但是呢,现在我们程序呢,是通过这个bber对在NIO里面,它是跟bber进行进行交互,就这样子的。啊,这样子也就是他就能实现一个什么呢?非阻塞的一个机制,因为它可以通过一个buffer,底层可以通过buffer实现非阻塞,对,好的,那你如果没有这个buffer,你看你要实现这个非主射其实是比较难的啊对。好的,那这个就是刚才老师给他说的channel buffer select在NIO。这个模式里面出现的位置,那么有了buffer以后呢,NIO就是面向缓冲区或者是面向块的一种编程了啊,有些地方说面向缓冲,有些地方说面向块,其实都是意识,因为它数据呢,是按照块的形式进行组织和管理的。数据读取到一个他稍后做处理的缓冲区,需要时可以在缓冲区中间进行移动,这样就增加了处理的灵活性,从而使得它呃使用它可以提供非阻塞的高性能,也就是说原先一个呃数据直接就在我们的这个呃连接里面进行这个处理了,而现在呢,我们有了缓冲区,这样呢就可以实现非阻塞的机制。
07:26
好好,紧接着我们再来看啊,待会呢,我们会有一个案例来讲的,同学们不要着急,一会呢,我们会举一个关于buffer的案例,好吧。我们接着往下看,Java n IO的非阻塞模式,使得线程从某个通道发送请求,读取数据,这样啊,呃,这写的有点不清楚,使一个线程从某个通道发送请求,或者。嗯,对,这样子就好了,或者。或者读取数据,但是呢,他仅仅能得到目前可用的数据,如果目前没有数据可用,什么都不会获取,而是保持现,而不是保持保持现成的阻塞,这句话要好好理解一下。
08:11
现在讲的呢,有点抽象,没有关系,一会儿呢,我们会有案例的啊,你看我这担心大家听的有点郁闷,我这专门说了后面有案例,因为我首先得把理论的东西给各位朋友介绍清楚了,我们再举案例,如果我上来就举案例,你还是不太明白这是为什么说总有一个顺序先后的问题。好,那么怎么理解它不是保持线程阻塞呢?它是这样子做的。我们还是以这个图为例,以这个图为例,大家还记不记得老师在前面讲的时候,如果说我们是这种bio模式,还记得吧,BI模式是不是如果一个S的往如就说这个server,它在这个这个读线程里面呢,它有一个read。
09:00
他进行一个读,但是如果这边呃,客户端没有给他发数据,是不是整个线程实际是主塞在这个read的方法的,还记得吗?刚才是不是我们讲这个案例了,这就是为什么刚才老师讲那个案例的时候,给大家说了一下,为什么为什么因为我要对比,但是在这个NIO模型里面呢,它的机制就不一样了,它是这样子的。你这个客户端,你这个客户端跟我们服务器端形成了一个通道以后啊,形成了一个通道以后,其实呢,我这里只有一个线程,我一个线程可以管理多个通道,明白我的意思吧,就我一个线程里面有有这个select,这个select里面呢,它可以注册很多的这个通道,你也就说你可以简单的理解一个线程可以管理多个通道,那么这当然这边也是一个通道了。对不对,因为我这边已经画过一次了,这边我就不再画了好吗?就画一次,大家明白是个什么东西就行了,然后他的机制是怎么样子的呢?就说这个select在这在这里这个等待,但是它不是阻塞性质的,它不是阻塞的,当我我这个select发现或者说通过这个事件驱动哈,因为每个通道呢,它会把它就说这个通道的是发生的一个事件,这个select是能够获取到的,比如说select他获取到,或者他他那个能够知的知道或者感知到。
10:26
那个通道有一个读的事件来了,那么这个时候呢,他就会去处理这个通道相关的读取的业务,如果你这个通道没有任何没有是属于一个inactive的,就是没有机,没有活动的状态,他会干什么呢?他就。他就他在这个地方,就可能去处理另外一个通道的事情。对,如果你这个通道也是处于一个非激活状态,他可能去处处理这个通道的事情,也就是说哪个通道发生了,发生了他关心的这个事件,他就去处理这个通道的事情,可能是读,可能是写,可能是连接,对不对?
11:07
哎,所以说这样子,那么如果说这些通道现在什么都没有事情,他甚至还可以做自己的事情,也就这个县城呢。他其实既可以去处理,呃,处理这个,如果你这个通道有事情,我就去处理这个通道,如果你这个通道没有事情呢,我就去处理别的通道,如果所有的通道都没有事情,我自己还可以去执行其他的任务。这个线程不会阻塞。不会阻塞,就是不管你是呃呃读,你如果有数据我就读,没有数据我就干别的事,就这个意思,那他怎么去实现的呢?后面我们举案例,最源代码才能把这个讲清楚,所以实际上他后后台他运行了一个呃运行的一个线程来做这个事情的。好的,我们继续往下看,通俗的理解NIO可以做到用一个线程处理多个操作,假设有1万个请求过来,根据实际情况,我们可以分配50个或者100个线程来处理,那如果分配50个的话呢,那么实际上就相当于我一个线程管理200个请求或者200个连接,对不对?如果是一百一百个线程呢,就相当于说我们画的这个是不是?
12:22
哎,如果我有100个这条线程,我我下面呢,如果要管理1万个请求的话,我就均分开就行了。好的,不像之前的主色IIO那样,非得非得分配一一万个线程,因为我一个线程可以管理多个连接了。在HTp2.0呢,使用了多路复用的技术,做到同一个连接并发处理多个请求,对,这样子呢,2.0其实比1.1大了好几个数量级,也是现在的浏览器呢,很多都支持了2.0。这样呢,也就让我们可一个服务器可以服务多个浏览器。
13:00
好,这就是,呃,刚才老师这个说完了,这就是我们NIO的基本介绍啊,IO的基本介绍一会呢,我们就会举例来说明这个NIO,这个案例呢,就NIO的这个buffer,先把这个buffer说完哈,把这个buffer的使用说完,然后呢,我们再来给大家讲一下这个NIO到底是怎么回事,好,这一讲我们先说到这里。
我来说两句