说说Java NIO【转】

转自:http://www.molotang.com/articles/894.html

在Java发布JDK1.4之后,NIO也随之出现了。NIO的出现实际上是为了给Java开发提供更多更多更灵活的接口,当然也是为了提高性能。我们本篇对NIO做一个概述。

0. IO的同步异步和阻塞

Java NIO就是Java New IO。但NIO也通常会和BIO和AIO放在一起来提,有人把NIO理解为non-blocking IO,即非阻塞IO。这个理解其实也是有道理的,因为NIO使得非阻塞IO成为了可能。我们这里就对IO的同步异步和阻塞非阻塞简单整理下,这实际上是对IO分类的两个维度。

阻塞和非阻塞,这个很好理解。阻塞就是当线程发起IO请求后线程阻塞,直到IO操作完成后线程再恢复执行。非阻塞就是发起请求,如果没有结果也不需要等待,直接返回。

同步和异步有很多解释。

一种说法,同步异步是指有状态依赖,同步一般是指做完一件事情之后再做另一件事情,也就是说做第二件事情之前要等待第一件事情完成。而异步则可以不考虑这些直接去做别的事情。

也有一种说法是通信的方式,由谁来负责通知IO的实际完成事件。

http://www.zhihu.com/question/19732473

Java传统的字节流字符流IO大部分都是BIO,即阻塞IO。而在NIO中,Channel则可以使用非阻塞式的IO请求。在JavaSE 7中,又增加了一些AIO的特性。

1. Java API中的NIO

我们看下Java API中NIO的包。

Java NIO API

java.nio包中主要是包含了NIO的Buffer的概念定义。而java.nio.channels包中则主要是Channel概念相关类的定义,Selector的概念也定义在这个包中。这三者是Java NIO的主要角色,除此之外Java NIO也定义了其它子包。其中很多地方都用到了SPI,即Service Provider Interface的概念定义了子包。

除此之外,Java NIO中还包含了字符集Charset、正则表达式和文件处理相关的内容。

2. IO复用

按我的理解,JavaNIO最吸引人的还是IO复用的特性。

在NIO之前,通常一个Java的服务器接到很多客户端的连接请求,而为每一个请求都开辟了一个线程做请求处理。而随着异步请求和长连接的流行,很多时候,一个连接虽然一直处于保持状态,但数据请求很少,不需要很多资源对请求进行持续处理。而之前每一个连接一个线程的模式就会浪费服务器资源,因为线程是需要占用资源的。

更为合适的一种方式是,连接可以一直维持,但处理请求的线程拿来复用,即一个线程处理多个连接比较分散的请求。这就是我们要说的IO复用。

在NIO中,每一个数据连接都可以对应为一个Channel,而我么可以把针对某个Channel的特定感兴趣的事件注册到Selector上,处理请求的线程只要检测Selector的状态就好。当Selector收到特定的事件时,我们的执行线程可以通过这个Selector获取相关的Channel,进行相应的处理工作。此后继续检查Selector。这样一个线程就可以复用,来处理不同Channel上的数据请求。

参考:

http://docs.oracle.com/javase/1.4.2/docs/guide/nio/

作者原创,难免有错误,欢迎读者热心评论留言指出,以免误导他人,谢谢!

时间: 2024-10-15 19:07:15

说说Java NIO【转】的相关文章

Java NIO (五) 管道 (Pipe)

Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 如下图: 向管道写数据: 从管道读数据: 1. 从读取管道的数据,需要访问source通道. 2. 调用source通道的read()方法来读取数据

Java NIO中的缓冲区Buffer(一)缓冲区基础

什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作: 常见的缓冲区如ByteBuffer.IntBuffer.DoubleBuffer...内部对应的数组依次是byte.int.double... 与通道的关系 在Java NIO中,缓冲区主要是跟通道(Chann

Java NIO通信框架在电信领域的实践

Java NIO通信框架在电信领域的实践 此文配图有错,华为电信软件V1版逻辑架构图与华为电信软件V2 MVC版逻辑架构图两张配图是同一张啊 另:我觉得作者在本文中遇到由于同步io引起的历史遗留问题更多的是架构的问题,在作架构时就需要考虑到同步io引起的阻塞问题,我觉得比较好的解决方案是使用排队的方式来下发请求,而不是每次下发请求都启一个线程,这样如果对方还是响应慢的话即使是用nio也是解决不了问题的.

java nio

NIO 是java nonblocking(非阻塞) IO 的简称,在jdk1.4 里提供的新api .Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持.字符集编码解码解决方案. Channel :一个新的原始I/O 抽象. 支持锁和内存映射文件的文件访问接口. 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O . Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,之前,在打开

JAVA NIO 内存映射(转载)

原文地址:http://blog.csdn.net/fcbayernmunchen/article/details/8635427 Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当

java nio 大白话描述(一)

java nio基本上常用的组件,selector,channel,buffer.这三个,其他的可以用到的时候再去参考就可以了. 看一本书的时候,基本看前三章或者四章基础知识,剩下的,实际生产中用到了再去看就可以. 大白话解释这三个重要的单词 Channel: Java的nio中,channel其实是用于传输的,也可以说是管道,是一个工具,可以对比一下io中的流,很类似.但是io中的流都是单向的,但是channel通道是双向的,就是这个通道里既可以读,也可以往里面写.这个channel跟buff

Java NIO -- 管道 (Pipe)

Java NIO 管道是2个线程之间的单向数据连接. Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 举个例子: package com.soyoungboy.nio; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.junit.Test; public class TestPipe { @Tes

Java NIO(六) Selector

Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是本文所涉及到的主题列表: 为什么使用Selector? Selector的创建 向Selector注册通道 SelectionKey 通过Selector选择通道 wakeUp() close() 完整的示例 为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只需要更少的

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

Java NIO (二) 缓冲区(Buffer)

缓冲区(Buffer):一个用于特定基本数据类型的容器,由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的Buffer 主要用于和NIO中的通道(Channel)进行交互, 数据从通道(Channel)读入缓冲区(Buffer)或者从缓冲区(Buffer)写入通道(Channel).如下,我画的一个简图,Chanenl直接和数据源或者目的位置接触,Buffer作为中介这,从一个Channel中读取数据,然后将数据写入另一个Channel中. Bu