异步,同步,阻塞,非阻塞以及NIO,BIO,AIO

看了下网上关于这四个的概念,说的太玄乎了,而且还不怎么对,其实没有那么复杂,我来用通俗粗暴的方式说下这四个的区别吧,便于大家理解。

上面左边是main方法下的四个方法

public static void main(String[] args){
    woca();
    wocao();
    wori();
    wozei();
}

同步:woca()方法执行完之后,等待响应后,才开始执行wocao()方法。意思就是一请求一响应,就是同步

 异步:woca()方法执行完之后,无需等待对方响应,直接执行wocao()方法;至于对方啥时候响应那他随便。意思就是一请求,不管他响应,到时的响应不知道啥时候啥地方响应,就是异步

        有人问他到时要响应了,在哪响应,答:他可以调用回调方法调到另一处,或者只是做个变量标记以下,你下次可以读这个变量来取到你自己要的响应值

阻塞:woca()方法执行完之后,对方在while(啥时候break呢)那死循环或者睡眠sleep()了半天,然后最后墨迹半天给你响应了,这叫阻塞

非阻塞:woca()方法执行完之后,对方立马给你个回复,这叫不阻塞既就是非阻塞。

----------------------------------------------------想看的看---------------------------------------------------------------

额外话题:关于BIO(同步阻塞),NIO(同步非阻塞),AIO(异步非阻塞)的解释

 BIO

read方法默认是一个阻塞(想想上面说的阻塞)的 ,大家在BIO中读取数据的时候是不是用的inputstream.read();read底层就是个死循环在不停读取网卡(其实叫系统内核),我一调read(),我就等操作系统特喵给我回复,不回复我就不干其他的,这就是同步。所以为了不让程序闲着,一般开个线程让他专门等数据去。所以BIO这种工作方式一般叫同步阻塞IO

NIO

大家知道accept接收到socket之后交给selector,这样假如有100个socket全交给selector,seletor在里面循环判断有没有数据来,select可以判断有没有数据来,而不是像read一样直接阻塞循环的读数据。select是假如有数据再交给别人去读取。

 AIO

上面看到了,bio和nio都是问下操作系统,操作系统回答,再去干别的。一问一答是同步。

这次到异步了,嘎!直接是操作系统给你通知,你只要调用操作系统提供的函数,其实就是你用的啥语言程序他肯定给你提供一个API。调用操作系统的一个函数,给他穿个对象参数,他到时有消息就调用你这个对象里的方法了。那么,你是不是只需要调用系统方法,然后就不管了去干别的了,这叫异步,然后系统那边搞完了有数据来了,给你通知,让你去那块内存自己读去,你是不是当时不阻塞了。只是在你主动去内存读你要的数据的时候这时回阻塞。但是有个零拷贝的东西挺好下次说。要不然脱离本章的宗旨了

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值