`
singleant
  • 浏览: 375061 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK7 AIO 初体验

阅读更多

JDK7 AIO初体验


JDK7已经release一段时间了,有个重要的新特性是AIO。
今天趁闲暇,简单体验了下,简单分享如下:

关于AIO的概念理解
关于AIO的概念,仅谈谈个人的一点理解。可能不到位,请大家指出。
Io的两个重要步骤:发起IO请求,和实际的IO操作。在unix网络编程的定义里异步和非异步概念的区别就是实际的IO操作是否是由操作系统完成。如果是就是异步,如果不是就是同步。
而阻塞和非阻塞的区别在于发起IO请求的时候是否会阻塞,如果会就是阻塞,不会就是非阻塞。

本人理解能力有限,想了个例子来辅助自己理解:
小明想要买一本<深入java虚拟机>的书,以下几个场景可以来理解这几种io模式:
1.    如果小明每天都去书店问售货员说有没有这本书,如果没有就回去继续等待,等下次再过来文。(阻塞)
2.    如果小明告诉售货员想买一本<深入java虚拟机>的书,那么就在家里等着做其他事情去了,如果书到了售货员就通知小明,小明再自己过去取。
3.    如果小明告售货员想买一本<深入java虚拟机>的书,然后告诉售货员到了帮他送到某某地方去,就做其他事情去了。小明就不管了,等书到了,售货员就帮他送到那个地方了。


售货员可以认为是操作系统的一个服务,而小明是一个用户进程。不知道是否有误,如果有误请大家拍砖指出,谢谢。
可以看出2,3的效率明显要比1高。但是1最简单,而2,3需要一些协作。充分证明了团队合作的力量。

JDK7 AIO初体验
AsynchronousChannel:支持异步通道,包括服务端AsynchronousServerSocketChannel和普通AsynchronousSocketChannel等实现。
CompletionHandler:用户处理器。定义了一个用户处理就绪事件的接口,由用户自己实现,异步io的数据就绪后回调该处理器消费或处理数据。
AsynchronousChannelGroup:一个用于资源共享的异步通道集合。处理IO事件和分配给CompletionHandler。(具体这块还没细看代码,后续再分析这块)

以一个简单监听服务端为例,基本过程是:
1.    启动一个服务端通道
2.    定义一个事件处理器,用户事件完成的时候处理,如消费数据。
3.    向系统注册一个感兴趣的事件,如接受数据,并把事件完成的处理器传递给系统。
4.    都已经交待完毕,可以只管继续做自己的事情了,操作系统在完成事件后通过其他的线程会自动调用处理器完成事件处理。

以下用一个例子来简单实现,一个服务端和客户端。服务端监听客户端的消息,并打印出来。

AIOServer.java

package io.aio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * 
 * @author noname
 */
public class AIOServer {
	public final static int PORT = 9888;
	private AsynchronousServerSocketChannel server;

	public AIOServer() throws IOException {
		server = AsynchronousServerSocketChannel.open().bind(
				new InetSocketAddress(PORT));
	}

	public void startWithFuture() throws InterruptedException,
			ExecutionException, TimeoutException {
		System.out.println("Server listen on " + PORT);
		Future<AsynchronousSocketChannel> future = server.accept();
		AsynchronousSocketChannel socket = future.get();
		ByteBuffer readBuf = ByteBuffer.allocate(1024);
		readBuf.clear();
		socket.read(readBuf).get(100, TimeUnit.SECONDS);
		readBuf.flip();
		System.out.printf("received message:" + new String(readBuf.array()));
		System.out.println(Thread.currentThread().getName());

	}

	public void startWithCompletionHandler() throws InterruptedException,
			ExecutionException, TimeoutException {
		System.out.println("Server listen on " + PORT);
		//注册事件和事件完成后的处理器
		server.accept(null,
				new CompletionHandler<AsynchronousSocketChannel, Object>() {
					final ByteBuffer buffer = ByteBuffer.allocate(1024);

					public void completed(AsynchronousSocketChannel result,
							Object attachment) {
						System.out.println(Thread.currentThread().getName());
						System.out.println("start");
						try {
							buffer.clear();
							result.read(buffer).get(100, TimeUnit.SECONDS);
							buffer.flip();
							System.out.println("received message: "
									+ new String(buffer.array()));
						} catch (InterruptedException | ExecutionException e) {
							System.out.println(e.toString());
						} catch (TimeoutException e) {
							e.printStackTrace();
						} finally {

							try {
								result.close();
								server.accept(null, this);
							} catch (Exception e) {
								System.out.println(e.toString());
							}
						}

						System.out.println("end");
					}

					@Override
					public void failed(Throwable exc, Object attachment) {
						System.out.println("failed: " + exc);
					}
				});
		// 主线程继续自己的行为
		while (true) {
			System.out.println("main thread");
			Thread.sleep(1000);
		}

	}

	public static void main(String args[]) throws Exception {
		new AIOServer().startWithCompletionHandler();
	}
}
 


AIOClient.java

package io.aio;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;

public class AIOClient {

	public static void main(String... args) throws Exception {
		AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
		client.connect(new InetSocketAddress("localhost", 9888));
		client.write(ByteBuffer.wrap("test".getBytes())).get();
	}
}
 



服务端写了两种处理实现方式,startWithCompletionHandler是通过Handler来处理,startWithFuture是通过Future方式来处理。startWithCompletionHandler方法里可以看到调用accepte()完成异步注册后,线程就可以继续自己的处理了,完全不被这个io所中断。

从以上来看AIO的代码简单了很多,至少比NIO的代码实现简单很多。

 

本文理解暂处于体验阶段,深入学习还待后面,欢迎一起交流。
   
参考资料
http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
http://blog.csdn.net/roger_77/article/details/1555170

http://download.oracle.com/javase/tutorial/essential/io/file.html

分享到:
评论

相关推荐

    JDK7安装包.zip

    JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7...

    JDK7新特性(完整篇)

    1.1 JDK7新特性&lt;一&gt;概述 . . . . . . . . . ....1.2 JDK7新特性&lt;二&gt; 语法 ....1.3 JDK7新特性&lt;三&gt; JDBC4.1 ....1.4 JDK7新特性&lt;四&gt; NIO2.0 文件系统 ....1.5 JDK7新特性&lt;五&gt; fork/...1.8 JDK7新特性&lt;八&gt;异步io/AIO . . . . . . . .

    JDK1.7 AIO

    NULL 博文链接:https://shihuan830619.iteye.com/blog/2258961

    jdk7下载下载

    jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载

    jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 百度网盘下载

    jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享

    jdk7chm,java7帮助,jdk7api,jdk1.7帮且文档

    jdk7chm,java7帮助,jdk7api,jdk1.7帮且文档,jdk7api chm,JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了...

    jdk7 jdk-7u80-linux-x64 网盘下载

    jdk7 jdk-7u80-linux-x64 网盘下载

    jdk7 免安装版 win64

    jdk7免安装版,可以正常使用,有问题可以联系我,JDK(Java Development Kit)就是Java的开发工具包,无论是开发javase,javaee,javaee.是给Java开发者必须用到的开发工具

    jdk7-aarch64-uos.tar.gz

    jdk7,openjdk7,适用于arm64、aarch64架构linux等国产化服务器,如银河麒麟V10、uos等服务器系统。 详细信息 jdk7 arm64 aarch64 。亲测可用。

    jdk-7u80-windows-x64安装包

    jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...

    jdk-7u80-windows-x64.exe 【官方下载的jdk1.7、jdk7,windows 64位版】

    jdk-7u80-windows-x64.exe 【官方下载的jdk1.7、jdk7,windows 64位版】

    jdk-7u80最终版

    JDK1.7最终版,jdk-7u80,包含文件如下: jdk-7u80-linux-i586.gz jdk-7u80-linux-x64.tar.gz jdk-7u80-windows-i586.exe jdk-7u80-windows-x64.exe

    windows-java-jdk7

    jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包

    jdk1.7 32位官方正式版 jdk-7u79-windows-i586 下载

    jdk-7u79-windows-i586.exe JDK7 稳定版 源官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

    jdk7(Linux 平台jdk7 )

    linux平台的64位版本jdk7,官方原版,hash可匹配验证 。

    jdk7安装程序

    jdk7安装程序

    jdk7下载 Mac

    Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好...

    JDK7 Windows32位

    JAVA JDK7 1.7.80 Windows 32位版本,生产环境中亲自安装好用。

    Java JDK 7学习笔记 PDF

    Java JDK 7学习笔记 PDF

    JDK7api JDKAPI

    JDK7u4的API,JDK7的帮助文档

Global site tag (gtag.js) - Google Analytics