Netty 之 netty源码学习之大话java NIO

沉淀了一个月安安心心地学习了家纯大神的Jupiter(https://github.com/fengjiachun/Jupiter),感觉受益良多,感觉自己学习了这里面的精华的50%,不是谦虚,而是无知,因为我不知道着里面还有多少是我没有理解的,也许我看懂了他的代码,但我现在还不知道他那样做的好处吧


废话不多说,听了大神的意见,开始慢慢看netty的源码,在学习netty源码之前,我们还是初步了解一下NIO


我也不想重复造轮子,而且我觉得我造的轮子并不比别人家的好,初识NIO,还是推荐去http://ifeve.com/java-nio-all/讲的还是很不错的~


看完之后,我想讲一个故事,一起理解一下NIO和BIO之间的区别,还有NIO的selector这个组件的理解


阻塞IO就是客户端发送请求的时候,需要根据服务端的脸色来看,当服务端有线程空闲的时候才会勉强帮助处理这个请求,就很像我们在工作日请假去银行办理业务,如果银行客服比较空闲的话,会立即给你处理, 如果此时所有的人都在排队的话,不好意思,你啥也不能坐,坐着吧,看看手机,取号排队吧。

蛋疼的是,假如所有的银行客户都在忙,且忙的业务都很大的话,比如排在你前面那个客服(线程)处理一个亿的定期存款业务,各种复杂的流程,初步一算,前面一个业务操作没有2个小时下不来,好吧,你接着等吧,等着饭点了,银行可不管饭,不好意思,您下次请早,今天服务到此结束了,尼玛,银行拒绝处理,好了,今天排队白搭了,更重要的事就是今天假白请了,工作量也在那阻塞了,完了,一切都完了

这就是阻塞,两端都在阻塞,你在服务端的请求阻塞了,客户端的工作量也阻塞了,这就是阻塞的悲剧

NIO就比较高大上了,故事继续:

晚上加班到11点把白天阻塞的工作量加班干完,到家11点半,洗洗澡,看看零点新闻,说银行业务改革了,大大加快业务处理速度,顿时精神大振,明天去银行接着办理业务,第二天吃了一个煎饼,精神充足的去银行了,发现银行门口等的人很少,感觉有戏,准备去排队,正准备去取排队的序号,一个帅气的黑衣人站在门口柜台的地方热情地问:“这位帅哥,干啥啊?”

屌丝客户:“我来办贷款!”

黑衣人:“那填下单子,贷多少钱,贷多长时间,收入流水账单,收入证明,手机号码,身份证复印件....”

屌丝客户:“好....” 填写中...

1分钟后,写好准备排队...

黑衣人:“你干啥,不用排队,你把填写的资料放在我的柜台上,我等下会帮助你放置在三号柜台的那个美女的案板上,而你可以去上班了,办好了会给你打电话,去上班吧”

屌丝客户:“好....(其实我还想看下那个漂亮的客服妹子呢)”

黑衣人貌似看出屌丝客户的想法,说道:“哦,对了,负责你案子的就是那个三号柜台的那个美女,手机号码是xxxxxxxxx!”

屌丝客户就心满意足地走了......

下午的时候就收到银行的那个美女的电话了:“亲,你的手续办好了,资料已经邮件给你了,你可以查收具体的信息了,如果还有其他的问题,就打这个号码联系我,我还有其他的客户问题要处理,如果问题,欢迎来电!”

好了,这个小故事讲完了,我们来分析一下新的场景对应的NIO模型

角色对应:

客户(N多客户)这些客户就是N多的SocketChannel,n多的客户端请求------>SocketChannel

黑衣人------->selector

黑衣人所处的门口柜台-------->ServerSocketChannel (ServerSocketChannel.accept()这个方法相当于放置各种请求)

三号柜台的美女客户就是服务端的线程,处理各种请求------------>Thread

美女客服的手机号码保存在屌丝客户那边(当然客户手机号码也在美女客户那边),那么这个手机号码就是客户端的selector,当服务端处理好请求的时候,就会打电话通知你,屌丝客户一看客服的号码来电了,说明那边处理好了---------美女手机号码======客户端的selector

恩,到此为此,NIO的模型基本上已经出来了,你会发现黑衣人的角色很重要,他就像一个接收者,用来负责各种到来的链接,他的职责很简单,而不做任何实际操作

这样做的好处就能体现NIO的牛的地方:两边都做到了解耦,没有了强依赖,没有了阻塞



从故事中回来,NIO就是这么一个模型,selector就是现实世界的那个黑衣人,永远都是接受请求,但不做任何处理,他就像一个事件驱动类型的dispatcher,与spring mvc的dispather不一样,他不会主动去分发任务,如果你是服务端的thread需要不断的扫描这个黑衣人桌上的文件,这些"文件"就是我们需要解决一个个IO请求


不知道大家有没有对NIO有了一点初步的了解了~谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值