JAVA NIO 简介 (netty源码死磕1.1)
【基础篇】netty 源码死磕1.1:
JAVA NIO简介
1. JAVA NIO简介
Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO。由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O)。
NIO弥补了原来同步阻塞I/O的不足,它在标准Java代码中提供了高速的、面向块的I/O。
Java NIO 由以下几个核心部分组成:
Channel
Buffer
Selector
1.1. NIO 和 OIO 的对比
旧的IO(OIO) 和 NIO 的区别主要体现在三个方面:
(1)OIO 基于流(Stream oriented),而 NIO 基于 Buffer (Buffer oriented);
(2)OIO 操作是阻塞的,而 NIO 操作是非阻塞的;
(3)OIO 没有 selector 概念,而 NIO 有 selector 概念.
旧的IO(OIO) 是面向字节流或字符流的,在一般的OIO操作中,我们以流式的方式顺序地从一个 Stream 中读取一个或多个字节,因此,我们也就不能随意改变读取指针的位置。
而在 NIO 中,而是引入了 Channel 和 Buffer 的概念。在 NIO 中,只需要从 Channel 中读取数据到 Buffer 中,或将数据从 Buffer 中写入到 Channel。并且,不像OIO 那样是顺序操作,在NIO 中,我们可以随意地读取任意位置的数据.
1.2. 阻塞和非阻塞
在OIO中,Java 提供的各种 stream 流操作都是阻塞的,例如我们调用一个 read 方法读取一个文件的内容,那么调用 read 的线程会被阻塞住,直到 read 操作完成。
而 NIO 的非阻塞模式允许我们非阻塞地进行 IO 操作。 例如我们需要从网络中读取数据。在 NIO 的非阻塞模式中,当我们调用 read 方法时,如果此时有数据,则 read 读取并返回; 如果此时没有数据,则 read 直接返回,而不会阻塞当前线程。
NIO的非阻塞,是如何做到的呢?
使用的是通道和通道的多路复用技术。先来看通道Channel。
1.3. Channel
OIO中,通常来说,一个连接使用有两个流,一个输入流一个输出流。通过两个流不断的进行输入和输出。
与之相对应,NIO中,通常来说,一个连接就是一个通道Channel表示,所有的 NIO 的 I/O 操作都是从 Channel 开始的。 一个 channel 类似于OIO中的两个 stream的结合体。
1.4. selector
通道Channel要进行多路复用,基础就是选择器selector。
Selector是何方神圣?
这是一个IO事件的查询器,通过 Selector,一个线程可以查询多个 Channel 的 IO 事件的就绪状态。
我们要做的工作,就是将要进行状态查询的Channel(相当于流)注册到选择器Seletor中。当我们向一个 Selector 中注册了 Channel 后,Selector 内部的机制就可以自动地为我们不断地查询(select) 这些注册的 Channel 是否有已就绪的 IO 事件(例如可读,可写,网络连接完成等)。
通过这样的 Selector 机制,我们就可以很简单地使用一个线程高效地管理多个 Channel 了。
1.5. Java NIO Buffer
当我们需要与 NIO Channel 进行交互时,我们就需要使用到 NIO Buffer,即数据从 Buffer读取到 Channel 中,并且从 Channel 中写入到 Buffer 中。
Buffer的使用,也是NIO非阻塞的重要的前提和基础之一。
下面结合实例和源码实例,开启JAVA NIO的死磕之路。次序从Buffer,然后到Channel,最后讲最复杂的 Selector多路复用器。
源码:
代码工程: JavaNioDemo.zip
下载地址:在疯狂创客圈QQ群文件共享。
无编程不创客,无案例不学习。疯狂创客圈,一大波高手正在交流、学习中!
疯狂创客圈 Netty 死磕系列 10多篇深度文章: 【博客园 总入口】 QQ群:104131248
JAVA NIO 简介 (netty源码死磕1.1)的更多相关文章
- Java NIO Buffer(netty源码死磕1.2)
[基础篇]netty源码死磕1.2: NIO Buffer 1. Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可 ...
- EventLoop(netty源码死磕4)
精进篇:netty源码 死磕4-EventLoop的鬼斧神工 目录 1. EventLoop的鬼斧神工 2. 初识 EventLoop 3. Reactor模式回顾 3.1. Reactor模式的组 ...
- ChannelHandler揭秘(Netty源码死磕5)
精进篇:netty源码死磕5 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...
- Pipeline模式(netty源码死磕6)
精进篇:netty源码死磕6 巧夺天工--Pipeline模式揭秘 1. 巧夺天工--Pipeline模式揭秘 1.1. Pipeline模式简介 管道的发名者叫,Malcolm Douglas M ...
- Netty源码死磕一(netty线程模型及EventLoop机制)
引言 好久没有写博客了,近期准备把Netty源码啃一遍.在这之前本想直接看源码,但是看到后面发现其实效率不高, 有些概念还是有必要回头再细啃的,特别是其线程模型以及EventLoop的概念. 当然在开 ...
- Netty环境搭建 (源码死磕2)
[正文]netty源码 死磕2: 环境搭建 本小节目录 1. Netty为什么火得屌炸天? 1.1. Netty是什么? 1.2. Netty火到什么程度呢? 1.3. Netty为什么这么火? 2 ...
- Java NIO——Selector机制源码分析---转
一直不明白pipe是如何唤醒selector的,所以又去看了jdk的源码(openjdk下载),整理了如下: 以Java nio自带demo : OperationServer.java Oper ...
- Netty 源码(ChannelHandler 死磕)
精进篇:netty源码死磕5 - 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4 ...
- Pipeline inbound(netty源码7)
netty源码死磕7 Pipeline 入站流程详解 1. Pipeline的入站流程 在讲解入站处理流程前,先脑补和铺垫一下两个知识点: (1)如何向Pipeline添加一个Handler节点 ( ...
随机推荐
- Java基础- super 和 this 解析
1. superkeyword表示超(父)类的意思.this变量代表对象本身. 2. super訪问父类被子类隐藏的变量或覆盖的方法.当前类假设是从超类继承而来的,当调用super.XX()就是调用基 ...
- [PWA] Customize the Splash Screen of a PWA built with create-react-app
Android displays a splash screen for PWAs based on the icons and names you provide, but iOS just dis ...
- Angular 学习笔记——自定义指令
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- 在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用
在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用 须要在project中设置例如以下: 1.打开project中的myapp-Info.plist文件 2.打开 ...
- tail -f 不断刷新
查看log tail -f 会将其不断刷新显示
- Linux作业(三)-shell统计某文章中出现频率最高的N个单词并排序输出出现次数
Linux课上的作业周三交,若有考虑不周到的地方,还请多多不吝赐教. shell处理文本相关的经常使用命令见此博客 # #假设输入两个參数 则第一个为统计单词的个数.第二个为要统计的文章 #假设输入一 ...
- eclipse上的git命令使用浅析,搭建Maven项目
eclipse上的git命令使用浅析 2016-03-31 14:44 关于eclipse上git的安装和建立代码仓库的文章比较多,但作为一个初识git的人更希望了解每个命令的作用. 当项目连接到 ...
- 进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
摘要:本文主要介绍进程的基本属性,基本属性包含:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义: #include <sys/typ ...
- Qemu事件处理机制简介
Qmeu 采用了基于事件驱动的架构,所有的事件都在一个事件循环(event loop)中被处理,系统中默认的事件循环是在main-loop.c 中的主循环(main loop).我们也可以使用 –ob ...
- Atitit.jdk java8的语法特性详解 attilax 总结
Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...