快速了解NIO
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的更多相关文章
- tomcat架构分析 (connector NIO 实现)
出处:http://gearever.iteye.com 上一篇简单记录了缺省配置的connector的内部构造及消息流,同时此connector也是基于BIO的实现.除了BIO外,也可以通过配置快速 ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- Java通过NIO实现快速文件拷贝的代码
将内容过程重要的内容片段做个记录,下面的内容段是关于Java通过NIO实现快速文件拷贝的内容. public static void fileCopy( File in, File out ) thr ...
- 使用NIO快速复制Java文件
package com.test.test; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputS ...
- Netty快速入门(03)Java NIO 介绍-Buffer
NIO 介绍 NIO,可以说是New IO,也可以说是non-blocking IO,具体怎么解释都可以. NIO 1是在JSR51里面定义的,在JDK1.4中引入,因为BolckingIO不支持高并 ...
- Netty快速入门(05)Java NIO 介绍-Selector
Java NIO Selector Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读.可写.如此可以实现单线程管理多个channels,也就是 ...
- java nio 快速read大文件
If you want to make your first example faster FileChannel inChannel = new FileInputStream(fileName). ...
- Java经典代码片段——使用NIO进行快速的文件拷贝
public static void fileCopy(File in, File out) throws IOException { FileChannel inChannel = new File ...
- [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...
随机推荐
- F 阎小罗的Minimax (第十届山东理工大学ACM网络编程擂台赛 正式赛 )
题解:by Mercury_Lc 阎小罗的矩阵给的n和m都不超过300,枚举一下所有情况就可以了,用前缀和来储存.数组a[x][y]代表前x行前y列的和是多少,那么枚举每一种切割的方式就可以.注意一下 ...
- php curl 传递数据
<?php header("Content-type: text/html; charset=utf-8"); /** * curl 传递数据 */ class curl { ...
- AGC022E Median Replace
题意 给出一个长度为奇数\(n\)的残缺01串,问有多少种补全方法,每次将连续三个位替换为它们的中位数后,能有一种方案使它变为1. \(n \le 3*10^5\) 思路 左边表示栈顶. 将操作简化为 ...
- [提权]CVE-2018-8120漏洞复现
0x01 漏洞名称 Windows操作系统Win32k的内核提权漏洞 0x02 漏洞编号 CVE-2018-8120 0x03 漏洞描述 部分版本Windows系统win32k.sys组件的NtUse ...
- Wireshark 用户指南(3.1.0)
目 录 Preface 序 1. Foreword 前言 2. Who should read this document? 谁适合读该文档? 3. Acknowledgements 致谢 4. Ab ...
- Leetcode第三题《Longest Substring Without Repeating Characters》
题目: Given a string, find the length of the longest substring without repeating characters. For examp ...
- Channel继承关系
- 代码检查p626
1 编译运行p626 图10-3代码,提交编译运行的截图 2 STDOUT_FILENO的值是多少?提交在Ubuntu中查找这个值的命令截图
- Microsoft Visual C++ Runtime library not enough space for thread data
Microsoft Visual C++ Runtime library not enough space for thread data 电脑最近一直在运行的时候,弹出提示框,如下: 解决办 ...
- openwrt环境中某个运行在host端的软件如何安装到openwrt的$(STAGING_DIR_HOST)/bin下
可参考示例:见'git grep host-build.mk package/{system,utils}'