场景:
小李今天想在张老板那边买ipad,打电话去问,不知道有没有货
同步阻塞
电话拨通~~~
小李 : 喂,张老板有没有ipad?
张老板 : 我还不知道有没有,等我看看
----------------【电话持续连接中】----------------
(此是张老板在找货,小李干等着)
20分钟后…
张老板 : 有货,你来吧
小李 :行(挂断了电话)
可以得知,这种效率很低,就是传统的BIO,一个请求过去,必须等到结果返回后才结束,此是线程被阻塞了,啥也干不了
同步非阻塞
电话拨通~~~
小李 : 喂,张老板有没有ipad?
张老板 : 我还不知道有没有,等我看看
----------------【电话挂断】----------------
(此是张老板在找货,小李干其他的)
5分钟后…张老板拨通电话
张老板 :我还没找到呢
小李 : 好吧
----------------【电话挂断】----------------
10分钟后…张老板拨通电话
张老板 :我再找找看,记得是有的,现在没找到
小李 : 不着急,慢慢找
----------------【电话挂断】----------------
5分钟后…张老板拨通电话
张老板 :小李啊,我种于找到了,你过来吧
小李 : 好的
----------------【电话挂断】----------------
这个是典型的NIO,两方通讯后,线程不会被挂起,服务端会一直轮询监听事件,每隔一段时间给客户端回应结果,直到有可用结果后结束通讯
异步阻塞
电话拨通~~~
小李 : 喂,张老板有没有ipad?
张老板 : 我还不知道有没有,有了告诉你
----------------【电话挂断】----------------
(此是张老板在找货,小李傻等着)
20分钟后…张老板拨通电话
张老板 :找到了,过来吧
小李 : 行
这种方式一般用不着,感觉特别傻,效率也低
异步非阻塞
电话拨通~~~
小李 : 喂,张老板有没有ipad?
张老板 : 我还不知道有没有,你等着吧,有了20多分钟后送你家来
----------------【电话挂断】----------------
(此是张老板在找货,小李做其他自己的事情)
20分钟后
if(有货){
张老板把ipad送小李家里了
}else{
小李没等到ipad,知道那边没货了
}
这个是典型的AIO,两方通讯后,线程不会挂起,各做各的事情,有结果了直接返回
这个文章解释得比较专业,还有netty的,我这个纯属个人生活化的理解