这么说吧,NIO很简单,其实就是个牛逼IO

我是风月连城,喜欢用简单的语言阐述知识点

长期分享原创java文章,分享进阶架构师学习笔记及学习资料

喜欢的可以点赞关注,共同学习,一起进步



0 ) 哈哈,其实我是个标题党,NIO不是牛逼IO,是非阻塞IO

NIO 也能算是一种思想,非阻塞IO通信思想,Netty就是基于NIO思想的NIO框架,

想花一分钟知道Netty是什么的可以看看这么说吧,Netty很简单,其实就是个Jar包,是作为通讯组件用的

什么是非阻塞?(为什么我没有说什么是IO,既然你都学到NIO了,,,要是不知道什么是IO的话我也没办法咯..)

这篇文章也是简单介绍NIO,想要看各类源码的同学可以绕道了- -


1 ) 异步非阻塞例子:(网上看到的比较短小精悍的好例子,直接拿过来了)

老张爱喝茶,废话不说,煮开水。

出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,原地不动等水开。(同步阻塞)                                   

 ---------->老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看毛骗,时不时去看看水开没有。(同步非阻塞) 

 ---------->老张觉得自己有点傻

于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的响声。

3 老张把响水壶放到火上,立等水开。(异步阻塞)                                                

 --------->老张觉得自己有点傻

4 老张把响水壶放到火上,去客厅看毛骗,水壶响之前不再去看它,响了再去拿壶。(异步非阻塞) 

---------->嗯,老张觉得自己棒棒哒


2 ) 小结:简单讲,Java NIO的非阻塞模式就是,使一个线程从某通道发送请求读取(或者写入)数据,(如烧水)

他不是保持线程阻塞,所以在读取(或者写入)数据前,该线程可以继续做其他的事情。      (例如客厅看毛骗)


3 )  IO VS NIO 的比较  (不同之处)

1.IO只能实现阻塞式的网络通信。NIO能够实现非阻塞的网络通信.(废话)

2.标准IO基于字节/字符流进行操作;而NIO是基于通道(Channel)进行操作的。(话说,通往女人心灵的通道是xxx道...)

3.流的读写通常是单向的,要么输入,要么输出,不能既是输入流又是输出流。通道是双向的,既可以写数据到通道,又可以从通道中读取数据;


4 ) 学习目标 : 虽然现在我们不会直接编写NIO来完成我们的网络层通讯,而是使用成熟的基于NIO的网络框架来实现我们的网络层。如,netty、mina。但对NIO网络编程过程的了解,非常有助于我们更深入的理解netty、mina等网络框架,以至于能更好的使用它们。有人问了,不学这个对我敲代码有何影响,可以说,毛影响都没.


5 ) 知道什么是NIO后,我们再来看看java NIO的三个重要组成部分:

Channel(通道),Buffer(缓冲区),Selector(选择器)。

当然,类比学习是比较好的学习方法,这里我仍然跟传统IO做比较,希望他不要打我


6 ) Channel ( 通道 ),顾名思义,就是通向什么的道路,为某个提供了渠道。

1.传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。

而Channel是双向的,既可用来进行读操作,又可用来进行写操作。

2.具体的常见实现通道有FileChannel,SocketChanel,ServerSocketChannel,DatagramChannel等

跟具体的实现流FileInputStream,FileOutputStream,FileReader,FileWriter,节点流包装流缓冲流等等功能类似


7 ) Buffer(缓冲区),是NIO中非常重要的一个东西,实际上就是一个容器,是一个连续数组。在NIO中所有数据的读和写都离不开Buffer。在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。

上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。

简单的讲就是,要想使用Channel(通道)传递数据,必须先把数据丢进Buffer(缓冲区,容器)里.


在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:

ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer等


8 ) Selector , 可以说它是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。

以前传统socket编程时,accept方法会一直阻塞,直到有客户端请求的到来,并返回socket进行相应的处理。整个过程是就像上面的例子那样,直到水壶烧开了(响应回去了)才能去处理下一个请求.当然我们也可以用线程池的模式.

NIO则为我们提供了更好的解决方案,Selector选择器能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。并且是按顺序处理,基于通道(Channel)和缓冲区(Buffer)来传输和保存数据。

与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容