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. AdvanceEast源码理解

    目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...

  2. unity Assetboundle 工具

    Unity Asset Bundle Browser tool https://github.com/Unity-Technologies/AssetBundles-Browser assetboun ...

  3. Java+Bigdata学习路线

    Java+Bigdata学习路线 2019-05-28 07:04:33 @Auther:MrZhangxd STAGE 第一阶段:JAVA基础 |-第一阶段:JAVA基础 | |-可掌握的核心能力 ...

  4. centos 7 启动docker失败。

    刚安装docker-io,在启动的时候报如下错误: Error starting daemon: SELinux is not supported with the overlay2 graph dr ...

  5. 免sudo使用docker

    前沿:通过root安装完docker,在普通用户下执行docker相关命令的时候,报权限不足: 查看sock文件的权限: [hadoop@slave1 monitor]$ ll /var/run/do ...

  6. NOIP1999提高组 题解报告

    T1 导弹拦截 题目大意:依次有\(n\) (\(n \le 10^5\))枚导弹,一套导弹拦截系统只能拦截一系列高度递减的导弹(一套系统拦截的弹道不一定相邻).求一套系统最多能拦截多少导弹,以及最少 ...

  7. VS2017 怎么启用nuget程序包还原?

    以前VS2015的时候,在解决方案右键会有一个“启用nuget程序包还原”的选项. 现在换成2017了,这个选项的位置变成了“还原nuget包”,现在新建到TFS上的项目,别人下完都没法还原,求解! ...

  8. 迭代器Iterator、for循环遍历、泛型

    java.util.Collection接口 是集合的最顶层的接口,定义了集合共性的方法 接口无法直接创建对象,使用多态的方式创建对象 Collection<集合中的数据类型(泛型)> c ...

  9. 使用LAS数据集创建DEM和DSM

    作为 LAS 数据集转栅格工具的输入.大多数情况下,此工具的栅格化通过点的快速分组来完成.由于激光雷达相比较于其他采样技术比较密集,所以许多人相信分组已经足够了,不需要更耗时的插值方法.可以证明上述观 ...

  10. Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示

    在Android中加载ImageView一般都不会给ImageView的宽高设置一个确切的值,一般都是直接写成: <ImageView android:id="@+id/iv_test ...