zoukankan      html  css  js  c++  java
  • 快速了解NIO

     

    NIO的由来

    我们都知道,在jdk1.4的时候就开始引入NIO了,它是基于Selector机制的非阻塞I/O,可以将多个异步的I/O操作集中到一个或几个线程中进行处理,目的就是为了代替阻塞I/O,提到系统的并发吞吐量,以提升性能。

    什么场景下使用NIO

    当客户端的数据传递不是连续的,而是断断续续的,这时如果使用传统的阻塞I/O,则程序需要等待,若此时还有多个线程,每个客户端的请求使用一个线程进行处理,那么操作系统还要进行上下文切换,性能上更是雪上加霜。

    而此时使用NIO,则可以明显提升系统处理效率和性能。

    如何实现一个简易的NIO

    了解了NIO的由来和使用场景,那么接下来就实打实的写出来,不了解的同学不用担心看不懂相关的api,笔者已将每个步骤的注释都标明了,以方便大家阅读,相信大家看完下面的代码后就会轻松掌握。

    首先,我们先实现一个接收请求的线程(AcceptJob.class):

    3张图教你写NIO,学会了再也不用怕面试,年薪涨!涨!涨!

     

    接着,我们实现一个处理请求的线程(ProcessJob.class):

    3张图教你写NIO,学会了再也不用怕面试,年薪涨!涨!涨!

     

    好了,核心的代码完成了,下面接着写一个类(NioDemo.class),用来模拟服务端:

    3张图教你写NIO,学会了再也不用怕面试,年薪涨!涨!涨!

     

    到此为止,一个简易的NIO示例就完成了,AcceptJob负责接收不断而来的请求,ProcessJob时刻处理着到来的请求。

    最后,为了给大家演示一下效果,我们实现一个客户端(ClientDemo.class),用来模拟发送请求,然后我们先启动服务端(run一下NioDemo),在启动客户端即可:

    3张图教你写NIO,学会了再也不用怕面试,年薪涨!涨!涨!

     

    3张图教你写NIO,学会了再也不用怕面试,年薪涨!涨!涨!

     

    特别注意一下,clientSelector.selectedKeys().iterator()这一句,它的目的就是对当前已经就绪的客户端进行迭代,以便后续针对每个客户端进行处理。

    总结

    从代码就能看出,NIO的selector机制完全可以让线程不必等待客户端I/O的就绪(即不必阻塞),如果没就绪,我们完全可以去干别的事,等到就绪了,就会立即回来处理,这样一来,性能肯定能大大提升。

    温馨提示:NIO的使用绝不仅仅是上述示例这么简单,例子只是为了带领大家入门,给与在这块完全是空白的小白们一个基本概念的理解,想用好这一块,还需要多下点功夫。但是话说回来,虽然示例比较简单,却是麻雀虽小五脏俱全,希望对大家有所帮助。

  • 相关阅读:
    C# 用Linq的方式实现对Xml文件的基本操作(创建xml文件、增删改查xml文件节点信息)
    Linq Like
    BS下实现WIN7下Aero效果
    Log4Net使用指南
    Sql 中取小数点后面两位小数.
    微软企业库回滚操作
    C#文件操作
    LinQ To XML——用LinQ查询XML
    Sql Server 字段类型说明
    Blog of the Day:几个中文技术类Blogger Groups
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/10939758.html
Copyright © 2011-2022 走看看