NIO的由来

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

什么场景下使用NIO

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

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

如何实现一个简易的NIO

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

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

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

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

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

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

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

总结

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

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

快速了解NIO的更多相关文章

  1. tomcat架构分析 (connector NIO 实现)

    出处:http://gearever.iteye.com 上一篇简单记录了缺省配置的connector的内部构造及消息流,同时此connector也是基于BIO的实现.除了BIO外,也可以通过配置快速 ...

  2. Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

  3. Java通过NIO实现快速文件拷贝的代码

    将内容过程重要的内容片段做个记录,下面的内容段是关于Java通过NIO实现快速文件拷贝的内容. public static void fileCopy( File in, File out ) thr ...

  4. 使用NIO快速复制Java文件

    package com.test.test; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputS ...

  5. Netty快速入门(03)Java NIO 介绍-Buffer

    NIO 介绍 NIO,可以说是New IO,也可以说是non-blocking IO,具体怎么解释都可以. NIO 1是在JSR51里面定义的,在JDK1.4中引入,因为BolckingIO不支持高并 ...

  6. Netty快速入门(05)Java NIO 介绍-Selector

    Java NIO Selector Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读.可写.如此可以实现单线程管理多个channels,也就是 ...

  7. java nio 快速read大文件

    If you want to make your first example faster FileChannel inChannel = new FileInputStream(fileName). ...

  8. Java经典代码片段——使用NIO进行快速的文件拷贝

    public static void fileCopy(File in, File out) throws IOException { FileChannel inChannel = new File ...

  9. [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化

    目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...

随机推荐

  1. ELF格式说明

    ELF file header (ELF文件头) /* The ELF file header. This appears at the start of every ELF file. */ #de ...

  2. BigDecimal进行除法运算时的坑

      循环小数输出的坑 BigDecimal做除法时如果出现除不尽(循环小数)的情况,会抛异常: BigDecimal a = new BigDecimal("1"); System ...

  3. C# 图片进行马赛克处理

    MosaicHelper.AdjustTobMosaic( @"C:\Users\xxxue\Desktop\QQ图片20180704142029.jpg", @"C:\ ...

  4. ZR#998

    ZR#998 解法: 先把所有物品按照拿走的时间从小到大排序,拿走的时间相同就按照放上去的时间从大到小.那么一件物品上方的物品就一定会在它的前面. 考虑 $ dp $ ,设 $ f[i][j] $ 表 ...

  5. 微信小程序 使用字体图标 iconfont

    第一步:在阿里巴巴矢量图标库下载需要的图标 地址:https://www.iconfont.cn/ 添加至项目 第二步:打开在线代码 将在线代码复制 第三步:点击下载至本地下载图标 将下载的downl ...

  6. Mac 下反编译Android APK

    准备工作:安装ApkTool.dex2jar.JD-GUI 安装ApkTool 1.下载ApkTool.大家可以从 https://ibotpeaches.github.io/Apktool/inst ...

  7. [Linux] pwm设备驱动调试

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/11436190.html CPU:RK3288 系统:Linux 客户需求是通过 pwm 控制激光的强弱,写 ...

  8. 通过AS提交AndroidLibrary到JCenter仓库

    注意事项: //版本需要一致,如下版本对应gradle-4.4-all.zip dependencies { classpath 'com.android.tools.build:gradle:3.1 ...

  9. Keil综合(03)_map文件全解析[转]

    推荐分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:ht ...

  10. python 设计模式之访问者模式

    写在前面 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情形下实现 ...