Java NIO, AIO

示例代码位置:https://git.oschina.net/silentwu/nio-tutorial.git

一.基本概念解析

1) 阻塞和非阻塞 :

阻塞和非阻塞是进程在访问数据的时候,数据内是否准备就绪的一种处理方式 , 当数据没有准备的时候 阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里
非阻塞 : 当我们的进程访问我们的数据缓冲区的时候 数据没有准备好的时候 直接返回 不需要等待 . 数据有的时候 也直接返回 .

2) 同步和异步的方式:

同步和异步都是基于应用程序和操作系统处理 IO 时间锁采用的方式 . 比如同步应用程序要直接参与 IO 读写的操作 , 异步:所有的 IO 读写交给操作系统去处理 . 同步的方式在处理 IO 事件的时候 必须阻塞在某个方法上面等待我们的 IO 时间完成 ( 阻塞 IO 事件或则通过轮询 IO 事件的方式 ), 对于异步来说,所有的 IO 读写都交给了操作系统 这个时候 我们可以去做其他的事情 并不需要去完成真正的 IO 操作,当操作完成 IO 后 给我们的应用程序一个通知就可以的,
同步 :1) 阻塞到 IO 事件 阻塞到 read 或则 write. 这个时候我们就完全不能做自己的事情 . 让读写方法加入到线程里面 然后阻塞线程来实现 . 对线程的性能开销比较大 .

3)IO 事件的轮询 – 多路复用技术 (select 模式 )

读写事件交给一个单独的线程来处理,这个完成 IO 事件的注册供,还有就是不断的去轮询我们的读写缓冲区 看是否有数据准备好。 通知我们通知相应读写线程 . 这样的话 以前的读写线程就可以做其他的事情 这个时候阻塞的不是所有的 IO 线程 阻塞的 select 这个线程 .
Client Select 管家 BOSS
当客人来的时候 , 就给管家说 我来了,管家得到这个注册信息后, 给 BOSS 说 我这里有一个或则多个客人 , BOSS 你去给某人 A
这件东西,给另外人 B 这样东西。这个时候 客人是可以去做自己的事情的,比如看看花园等等, 当管家知道 boss 给他任务后 他就是去找对应的某人 告诉他 boss 给他某样东西。(根据我们的注册信息)

二.Java IO 模型

BIO:JDK1.4 以前我们使用都是 BIO 阻塞 IO
阻塞到我们的读写方法 , 阻塞到线程来提供性能 . 对于线程的开销本来就是性能的浪费 .
NIO:jdk1.4 linux 多路复用技术 (select 模式 ) 实现 IO 事件的轮询方式 : 同步非阻塞的模式 . 这个种方式目前是主流的网络通信模式 .
Mina , netty mina2.0 netty5.0— 网络通信框架 . 比我直接写 NIO 要容易些 并且代码可读性更好
AIO:jdk1.7 (NIO2) 才是实现真正的异步 aio ,学习 linux epoll 模式
AIO 使用的比较少 , 大家可以认真的学习一些思想
小结 :
1)BIO 阻塞的 IO
2)NIO select+ 非阻塞 同步非阻塞
3)异步非阻塞 IO

三.NIO AIO 原理的解读

对于网络通信而言 NIO , AIO 并没有改变网通通信的基本步骤,只是在其原来的基础上 (serverscoket,socket) 做了一个改进 .
Socket <—- 建立连接需要三次握手 —–> serversocket
对于三次握手的方式建立稳定的连接性能开销比较大 . 解决方案从思想上来说比较容易 就是减少连接的次数 . 对我们的读写通信管道进行一个抽象 .

原理四.NIO 原理

image

通过 selctor (选择器)就相当管家 ,管理所有的 IO 事件
Connction accept 客服端和服务端的读写 .—–IO 事件

selctor (选择器)如何进行管理 IO 事件
当 IO 事件注册给我们的选择器的时候 选择器会给他们分配一个 key (可以简单的理解成一个时间的标签) 当 IO 事件完成过通过 key 值来找到相应的管道 然后通过管道发送数据和接收数据等操作 .

数据缓冲区:
通过 bytebuffer ,提供很多读写的方法 put () get ()
服务端: ServerSocketChannel
客服端 : SocketChannel
选择器 : Selector selector=Select.open(); 这样就打开了我们的选择器 .

五. Selectionkey:

可以通过它来判断 IO 事件是否已经就绪 .
key.isAccptable: 是否可以接受客户端的连接
Key.isconnctionable: 是否可以连接服务端
Key.isreadable(): 缓冲区是否可读
Key.iswriteable(): 缓冲区是否可写

六. 如何获得事件的 keys

Selectionkey keys= Selector.selectedkeys();

七. 如何注册

channel.regist(Selector,Selectionkey.OP_Write);
channel.regist(Selector,Selectionkey.OP_Read);
channel.regist(Selector,Selectionkey.OP_Connct);
channel.regist(Selector,Selectionkey.OP_Accept);

八. AIO:

服务端 :AsynchronousServerSocketChannel
客服端 :AsynchronousSocketChannel
用户处理器 :CompletionHandler 接口 , 这个接口实现应用程序向操作系统发起 IO 请求 , 当完成后处理具体逻辑,否则做自己该做的事情 .

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

推荐阅读更多精彩内容

  • 这两天了解了一下关于NIO方面的知识,网上关于这一块的介绍只是介绍了一下基本用法,没有系统的解释NIO与阻塞、非阻...
    Ruheng阅读 7,119评论 5 48
  • NIO简介 *NIO到底是什么的简称?有人喜欢称之为New IO,因为它相对于以前的IO是新增的,所以官方称之为N...
    谜碌小孩阅读 1,133评论 0 9
  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 7,534评论 1 143
  • 一、基本概念描述 1.1 I/O简介 I/O即输入输出,是计算机与外界世界的一个借口。IO操作的实际主题是操作系统...
    4ea0af17fd67阅读 399评论 0 0
  • 今天靠油滋了。 这几个字是不是只有东北人懂?小时候穷啊,一年到头吃不到什么油水,菜大都是清汤寡水的, 记忆中那时吃...
    心若了无尘阅读 7,201评论 5 10