NIO的原理类比

假设:

你是一个餐馆的老板

一、BIO:

        1、餐馆开始营业了(Server启动)

        2、你跑到餐馆门口等着。。。(serverSocket.accept())

        3、一直等一直等一直等

        4、终于来了一个客人(客户端连接上了)

        5、你把他带到座位上等他点餐,可能这个客人有选择恐惧症,他就是一直不点餐,你就一直等着。。。(buf.readLine())

        6、一直等一直等一直等

        7、客人终于点餐了,你赶紧拿着单子去做菜(后台处理客户端消息)

        8、上菜(处理过程完成)

二、BIO升级

        不知道怎么回事,你这的客人好多都有选择恐惧症,坐到了座位上却迟迟不点餐,你一个人实在忙不过来了,客人全在那等着呢,于是。。。

        你请了10个服务员,外加一个厨子

        1、餐馆开始营业了(Server启动) 

        2、你把10个服务员全叫到门口,你说:“你们在这给我等着,有客人来就分一个人去领着客人去点餐!”

        3、一直等一直等一直等

        4、终于来了一个客人,服务员1 领着客人去点餐了,在那一直等着客人点餐。

        5、客人一个一个来了,服务员一个一个变少,眼看服务员都用完了客人还再来,还好服务员1及时的点完了餐。

        6、就这样,慢慢的运行了起来,就是把厨子累的够呛。

        但是吧,有些客人看了半天菜单他觉得不好吃不吃了,你快气死了,一个服务员等了仨小时你告诉我不吃了。。。。

三、NIO

        你觉得不行,有时候有人捣乱,来了坐着不点餐,就是霸着你的服务员不点,你心想这不会是竞争对手来搞事情的吧!!

        于是你想了个法子,你买了一套智能餐馆管理系统

        1、餐馆开始营业了(Server启动),你把门口的传感器打开了,10个服务员让他们扫地洗完该干啥干啥去

        2、一直等一直等一直等

        3、来了一个客人,客人还纳闷,这门口怎么没人啊!这时,门口的传感器检测到人(SelectionKey.OP_ACCEPT),赶紧发一条消息到中控电脑,你看到消息叫到:“服务员1,门口有客人了,赶紧去招待”。

        4、服务员1把客人带到餐桌坐下,对客人说:“我们这有只能点餐系统,您想吃啥直接在手机上下单,付款一键完成,我们马上就给您做”。然后服务员就走了。。。。走了。。。。

        5、客户一直没有点餐,不过谁管他呢,说不定他就是来吹空调的。。。

        6、你在电脑那盯电脑屏幕看有没有订单(轮询selector,这个方法selector.select()依然是阻塞的,意味着你就算没有订单没有客人进来你也不能离开电脑。。等着。。)。

        6、客户点餐了,订单直接出现在了你面前的电脑上(SelectionKey.OP_READ),你马上叫厨子做好上了菜。

        7、有些客人来了半个小时觉得不好吃就走了,不过没事,反正也没亏啥,服务员看着满大厅的客人心想:“这活干的过,真轻松。。。”,然后第二天你说要裁员了。。。。

主要思想:将漫长的“等待”变成及时的“通知”,服务端不用留10个进程去等待服务,只需要留一个进程查看消息,有需要的操作再去进行服务

省下来的进程就意味着:少的内存开销,少的进程切换

# NIO 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×