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. Centos7.x 安装 Supervisord

    [环境] 系统:Centos 7.3 软件:supervisord [安装Supervisord] yum install epel-release yum install -y supervisor ...

  2. TortoiseGIT提交

    Git最新版下载地址:https://gitforwindows.org/ TortoiseGit,Git客户端,32/64位最新版及对应的语言包下载地址:https://tortoisegit.or ...

  3. jmeter+ant执行 报错:Reference xslt.classpath not found 【采坑记录】

    问题: report: BUILD FAILED E:\jmeter\apache-jmeter-4.0\testcase\build.xml:29: The following error occu ...

  4. Arrays.toString的作用

    Arrays.toString()的作用是用来很方便地输出数组,而不用一个一个地输出数组中的元素. 这个方法是是用来将数组转换成String类型输出的,入参可以是long,float,double,i ...

  5. java集合类型源码解析之PriorityQueue

    本来第二篇想解析一下LinkedList,不过扫了一下源码后,觉得LinkedList的实现比较简单,没有什么意思,于是移步PriorityQueue. PriorityQueue通过数组实现了一个堆 ...

  6. docker安装hbase

    .下载安装Hbase: ().docker search hbase : 查找Hbase ().docker pull harisekhon/hbase:1.3 注意:不要安装最新版本的,不稳定 (我 ...

  7. legend3---19、要更多的从服务器端控制元素的显示和隐藏,而不要是页面端

    legend3---19.要更多的从服务器端控制元素的显示和隐藏,而不要是页面端 一.总结 一句话总结: 这样可以控制很多页面端的非法操作 1.html标签中data方式的数据,修改之后在标签上只显示 ...

  8. 腾讯基于 Flink 的实时流计算平台演进之路

    https://mp.weixin.qq.com/s/MGnG_Mpf6CUQWLJHvmWqLA

  9. python 了解一下__dict__

    写在前面 这几天在写关于描述器的博客,在了解描述器的机制的时候,翻了很多博客里面都提到了__dict__, 我想更多的了解一点描述器的机制,所以我得先弄清楚这个__dict__到底是干啥的. 计算机语 ...

  10. ISO/IEC 9899:2011 条款5——5.2.2 字符显示语义

    5.2.2 字符显示语义 1.活动位置是在一个显示设备上的位置,由fputc函数所输出的下一个字符会出现在那个位置上.写一个打印字符(由isprint函数)到显示设备的意图是为了在活动位置上显示那字符 ...