00:01
各位上硅谷的朋友们大家好,欢迎继续收看Java n IO课程,下面我们来学习里边的第一章关于Java n IO的概述。Java n IO刚才提到它是Java1.4开始引入一个新的IOa片,它可以以更高效的方式进行文件的读写操作,那下面呢,咱们针对NIO给各位先做一个总体上的一个介绍,咱们会通过三个方面来说明,第一个方面给各位说一下什么叫阻塞IO,第二个叫非阻塞IO,第三个关于NIO里面的相关的一个组成,那下面我们先来看里边的第一部分,就关于什么叫阻塞IO给各位做一个详细的介绍,那咱看一下我的课件中,我这里写到啊,就是在通常情况下呢,我们在进行同步IO操作的时候。
01:01
如果说咱们进行读操作,或者说写操作。那这个时候呢,我们的代码会阻塞,直至有供读取数据,或者直至有供数据能够写入操作,这个过程是比较传统方式,而这过程什么意思呢?给大家强调啊,按照咱们传统的操作过程中,咱们服务器会为每个请求是不是要建个线程,而这个线程就是单独负责一个客户请求,而这种方式呢,有它的缺点,第一个缺点。如果说你这里边啊,请求急剧增加,那咱们的线程数量是不是要随之增加,这样的话就会增大咱们服务器的开销,就算说你这过程中用到了线程池,但是线程池最终是不是也会达到它的最大数量,那这个时候你再有新的请求,它是不是也是无法处理的,所以这个叫阻塞,那这过程什么意思?给各位画个图,咱们来说明一下里面的过程,那这里边我来说一下啊。
02:06
比如说我们现在按照传统方式,它是这么做的,我们这里边每个请求咱为他都要创建一个线程,用这个线程来处理我们这个请求,这是我们的一个场景,那比如说我现在啊,这里边来了很多个请求,那每个请求咱们是不是都要成为线程,比如现在我第一个请求一个线程,然后第二个一个线程,第三个一个线程,这里边第四个以此类推,每个都要进个线程,那这个时候是不是会增加你服务器的压力啊?这个时候各位可能想到我是不能用这个线程池,但是线程池各位应该知道它有这么一个问题,我这里写一下,比如现在我们用到这个线程池。常吃的好处就是避免重复打开关闭,做到线程的复用,但是线程尺呢,比如这里边我的常驻线程达到了最大数量,而这里边最大线程数也达到了阻塞队列中线程也满了,这个时候我再进来新的这个请求,那我这个线程时是不是就无法进行处理了,比如现在我又来了现在请求,那线程池肯定就是无法再处理,它会执行我们那个拒绝的这么一个策略,所这样的话,这种方式就叫做阻塞IO,就是咱们调这过程,也就是说在这过程中呢,我们代码会阻塞,直到你有可供读取数据,如果说你做写操作的时候,它也会阻塞,直到数据能够写入为止,这个叫阻赛O,它的缺点可以说是一目了然,这是给大家做的说明。
03:48
而除了这个之外呢,咱们在这操作中还有一个那种叫做非阻塞O,也就是咱们说的NIO。那什么叫非阻织IO呢?给各位做一个介绍啊,非阻IO它是基于这个叫reactor的工作方式,它的IO调用不会被阻塞,而这个时候它是怎么做的呢?它是注册你感兴趣的特定时间,比如说我们的可读到达,那新的特性字就会连接等等,当发生特定事件的时候,这系统会通知我们,我们在做执行。
04:24
那这过程中呢,核心会到一个内容,这个内容叫做select头,也就是说什么意思?各位看这张图上画的很明确,比如说我现在啊,这里边我用个select,然后上面会有多个通道,我把多个通道在我的select中进行注册,而注册是我关心的事情,比如说我关心读,关心写,关心读或者写,那这个时候当这个通道中发生我关心的事情,就是我关心事情发生了,那会告诉我们,我们这里边在做处理。
05:00
比如说这个通道中发生了写操作,那他告诉我们,我们这里边就进行操作。也就是说通过一个selecter去实时监听多个通道,当通道中有咱们感兴趣事情发生,那就告诉我们,我们再进行执行,这就是关于这个非阻塞O,而它的特点大也看到了啊,它可以从select里边获取相应这个叫selection key,然后同时从K里边找到发生的事情和该事情具有所发生,这个就是China或者它的通道,也就说现在啊,我这个channel里边事情发生了,然后我来通过这个key找到China,然后把里面数据给它得到,所以它就是这么一个过程。当然我强调啊,就是大家要理解no的本质是什么呢?它是延迟IO的操作,当你真正发生IO的时候才进行,而不是咱们之前只要打开IO就一直等着IO操作。它的本质是延迟IO操作,通过一个去监听多个通道,当通道中有咱们感兴趣事情发生,它通过CK把这数据得到,最终完成我们的操作,所以这就叫做。
06:18
非阻塞欧,也就是咱们说的NIO这个过程。然后我下面有一张简单一张图做了一个比较,我这里写到啊,就是我们这个IO是面向流的,而NIO面向什么叫做缓冲区,这个缓冲区一会咱会详细说,另外IO是阻塞的,NIO是非阻塞的,在IO中没有选择器,I欧中包含这个select选择器。所以这是我们说的第二概念叫非阻塞欧。所以各位。把这两个基本概念给他要理解,一个叫阻塞IO,一个叫非做反O,然后这个说完之后,咱们继续往下看啊,关于咱们的NIO,我这里写到啊,NIO由以下三个核心部分组成,但是我强调啊,不是只有三个部分,是三个核心部分,一个叫channels,一个叫buffer,一个叫S,而这三个部分构成了IO的核心API。
07:21
当然它有其他组件,比如说这个type管道,Fire lock,这个文件锁等等,只不过这三个核心组件共同和它一起使用,这三个是最核心的,那那首先先简单说一下这个channel channel什么意思啊,翻译过来叫通道。在channel和IO里边啊,就是China是IO中的流,这两是差不多一个等级的,只不过这个流呢是单向的,比如说咱们的输入流,输出流,这各位应该都知道,而我们的channel是双向的,既能做读操作,又可以用来做写操作,这是他们的最大不同。
08:01
流是单向的,Channel是双向的,而channel它主要有这么几个内容,比如说这个在channel。Gra channel包括socket,包括socket,而从名字我们会看到啊,分为对应咱们的I oudp TCP,包括server CLA等等内容啊,这是我们提到的啊。而第二个叫buffer buffer翻译过来叫缓冲区,里边有这么几个,包括这个bit呀,Char double等等啊,这个咱一会会详细说,各位先知道这个缓冲区,然后第三个叫selecter选择器,Select什么意思呢?它是运行这个单线程,处理多个channel通道。如果说你的应用打开多个通道,在每个连接流量都很低,那这个时候使用selecter就会特别方便啊。比如说咱们一个聊天器程序中,我用select可以向里面注册多个channel,然后调用里面的方法,最终实现它的各自操作。也就说刚才我们提到的,通过一个select能去监听或者监控多个channel,而channel里边有他关心的事情发生,他就通过s key得到里边内容,最终完成它的操作。所以这是NIO的一个基本的概述。
09:20
通过我的介绍,大家对它有一个印象,咱们主要记住三部分,第一个你知道什么叫阻塞IO,第二个知道什么叫非阻IO,这个最重要,然后第三个就是NIO有哪几个核心部分,包括China。8SELECTER,然后咱们后面那种呢,其实就围绕这三个部分给各位详细来做个讲解,所以这是关于Java n IO的这么一个概述。
我来说两句