JAVA BIO、NIO、AIO之间的简单区别

BIO、NIO、AIO之间的区别


学习JAVA IO的过程中对这三种IO感到非常疑惑,网上对于这方面的文章感觉讲解起来也并不清晰,看了一些文章以后简单总结一下这三种文章的区别

BIO

BIO是一种同步阻塞的IO流,一个线程负责一个IO
用户线程会等待到它的IO执行完毕才能继续执行,当IO完成,用户线程继续执行,开始处理下一个IO。也就是说,多个用户进行IO时,IO必须按顺序进行,用户线程A完成IO后,用户线程A解除阻塞继续执行,再开始用户线程B的IO。
这里借用烧水壶的例子来解释,有多壶水需要烧,①过来说给我烧壶水,然后②和③也过来说需要烧水,此时他们仨都等待水烧开以后喝完水继续干活。
BIO采用的策略就是先烧A,A烧完以后把A给①,①喝完水继续干活,再烧B,B烧完以后把B给②,②喝完水继续干活,再烧C,C烧完以后把C给③,③喝完水继续干活。
烧水的开始、结束顺序都是A->B->C。

NIO

NIO是一种同步非阻塞的IO流,有专门的几个线程来负责IO,一个线程负责多个IO。
用户线程会等待到它的IO执行完毕才能继续执行,多个IO中任意一个IO完成,这个IO对应的用户线程就可以解除等待继续进行。也就是说,多个用户线程进行IO时,不需要按顺序进行,而是同时进行,谁的IO先完成,谁就可以先解除阻塞继续执行,用户线程B的IO完成后,用户线程B就可以继续进行。
继续使用上面的例子,①过来说给我烧壶水,然后②和③也过来说需要烧水,此时他们仨都等待水烧开以后喝完水继续干活。NIO采用的策略就是A、B、C同时烧水。
①需要烧水,A开始烧,②也需要烧水,B开始烧,③也需要烧水,C开始烧。
这时,如果B先烧开,那么把B给②,②喝完水继续干活,然后C烧开,把C给③,③喝完水继续干活,最后A烧开,把A给①,①喝完水继续干活。
烧水的开始顺序是:A->B->C
烧水的结束顺序是:B->C->A

AIO

AIO是一种异步非阻塞的IO流,也是有专门的几个线程来负责IO,一个线程负责多个IO。
关键在于用户线程不会阻塞,进行IO时不需要等待IO执行完毕,而是直接返回,用户线程继续向下执行,当IO执行完毕时,使用回调机制,进行后序的操作。
AIO同样也是一个线程负责多个IO,先完成的IO就先回调,这点与非阻塞的NIO是一样的。
如果了解或者使用过AJAX的同学应该很容易就能理解AIO的这种异步操作.
继续使用烧水的例子,AIO采用的策略就是,你需要烧水,过来我这里打一声招呼,然后你该干嘛干嘛,我给你烧就完事,而且像NIO一样多壶水一起烧。
①需要烧水,过来打声招呼,A开始烧,①继续去干活
②也需要烧水,过来打声招呼,B开始烧,②继续去干活
③也需要烧水,过来打声招呼,C开始烧,③继续去干活
这时,如果B先烧开,那么把②叫过来,把水给他,②喝水
然后C烧开,那么把③叫过来,把水给他,③喝水
最后A烧开,那么把①叫过来,把水给他,①喝水
烧水的开始顺序是:A->B->C
烧水的结束顺序是:B->C->A
最关键的点在于,①②③不需要像BIO和NIO一样,在那里傻傻地等水烧开,然后喝水,再继续干活
而且是找烧水店下单,自己继续干活,等水烧开以后,再去喝水(把需要水的任务完成)

以上是本人对BIO、NIO和AIO之间的理解,如有错误请不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值