概述

JDK7引入了Asynchronous I/O。I/O编程中,常用到两种模式:Reactor 和 Proactor。Reactor就是Java的NIO。当有事件触发时,我们得到通知,进行相应的处理。Proactor就是我们今天要讲的 AIO了。AIO进行I/O操作,都是异步处理,当事件完成时,我们会得到通知。

JDK7的 AIO包括网络和文件操作。两者大同小异,本文通过一个完整的客户端/服务器Sample来详细说明aio的网络操作。

AIO提供了两种异步操作的监听机制。第一种通过返回一个Future对象来事件,调用其get()会等到操作完成。第二种类似于回调函数。在进行异步操作时,传递一个CompletionHandler,当异步操作结束时,会调用CompletionHandler.complete 接口

范例

这个范例功能比较简单,就是客户端向服务端发送一个“test”命令,然后结束。

服务端程序 Sever.java

  1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.ByteBuffer;
  4. import java.nio.channels.AsynchronousServerSocketChannel;
  5. import java.nio.channels.AsynchronousSocketChannel;
  6. import java.util.concurrent.ExecutionException;
  7. import java.util.concurrent.Future;
  8. import java.util.concurrent.TimeUnit;
  9. import java.util.concurrent.TimeoutException;
  10. public class Server {
  11. private AsynchronousServerSocketChannel server;
  12. public Server()throws IOException{
  13. server = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8888));
  14. }
  15. public void start() throws InterruptedException, ExecutionException, TimeoutException{
  16. Future<AsynchronousSocketChannel> future = server.accept();
  17. AsynchronousSocketChannel socket = future.get();
  18. ByteBuffer readBuf = ByteBuffer.allocate(1024);
  19. socket.read(readBuf).get(100, TimeUnit.SECONDS);
  20. System.out.printf("Receiver:%s%n",new String(readBuf.array()));
  21. }
  22. public static void main(String args[]) throws Exception{
  23. new Server().start();
  24. }
  25. }

客户端程序 (Future版本)

  1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.ByteBuffer;
  4. import java.nio.channels.AsynchronousSocketChannel;
  5. import java.util.concurrent.ExecutionException;
  6. public class AIOClientWithFuture {
  7. private final AsynchronousSocketChannel client;
  8. public AIOClientWithFuture() throws IOException{
  9. client = AsynchronousSocketChannel.open();
  10. }
  11. public void sendMsg() throws InterruptedException, ExecutionException{
  12. client.connect(new InetSocketAddress("localhost",8888));
  13. client.write(ByteBuffer.wrap("test".getBytes())).get();
  14. }
  15. public static void main(String...args) throws Exception{
  16. AIOClientWithFuture client = new AIOClientWithFuture();
  17. client.sendMsg();
  18. }
  19. }

客户端程序(CompleteHandler版本)

  1. import java.net.InetSocketAddress;
  2. import java.nio.ByteBuffer;
  3. import java.nio.channels.AsynchronousSocketChannel;
  4. import java.nio.channels.CompletionHandler;
  5. public class AIOClientWithHandler {
  6. private final AsynchronousSocketChannel client ;
  7. public AIOClientWithHandler() throws Exception{
  8. client = AsynchronousSocketChannel.open();
  9. }
  10. public void start()throws Exception{
  11. client.connect(new InetSocketAddress("127.0.0.1",8888),null,new CompletionHandler<Void,Void>() {
  12. @Override
  13. public void completed(Void result, Void attachment) {
  14. try {
  15. client.write(ByteBuffer.wrap("test".getBytes())).get();
  16. } catch (Exception ex) {
  17. ex.printStackTrace();
  18. }
  19. }
  20. @Override
  21. public void failed(Throwable exc, Void attachment) {
  22. exc.printStackTrace();
  23. }
  24. });
  25. }
  26. public static void main(String args[])throws Exception{
  27. new AIOClientWithHandler().start();
  28. }
  29. }

相关类说明

AsynchronousSocketChannel 跟 SocketChannel操作类似,只不过改成异步接口了

AsynchronousServerSocketChannel跟ServerSocketChannel操作类似,只不过改成异步接口了

CompletionHandler 接口包括两个方法

void completed(V result, A attachment);

void failed(Throwable exc, A attachment);

总结

本文只是对jdk7的aio使用做了一个简单的说明。至于其性能提升多少,如何改进现有的网络应用程序,还在摸索中。这里推荐一个比较成熟的网络框架Project Grizzly:http://grizzly.dev.java.net。据说已经用aio重新实现了,有兴趣的同学可以去研究一下源码。

参考资料

(以下有些资料使用的jdk7版本太低,很多接口已经更改了,慎入!:)

http://www.ibm.com/developerworks/java/library/j-nio2-1/index.html?

http://www.iteye.com/topic/446298

http://www.iteye.com/topic/472333

本文是jdk7系列的终结了,感谢大家的支持!更多的内容可以访问我的blog

http://www.iamcoding.com

JDK7新特性<八>异步io/AIO的更多相关文章

  1. JDK7 新特性

    JDK7新特性的目录导航: 二进制字面值 switch 语句支持 String try-with-resources catch 多个类型异常 字面值中使用下划线 类型推断 改进泛型类型可变参数 其它 ...

  2. java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)

    一:jdk7新特性 可以表示二进制数值,以0b开头,中间可以使用下划线_分隔符.如下: @Test /** * 测试jdk新特性 */ public void testJdk7(){ int a=0b ...

  3. Java 新特性(3) - JDK7 新特性

    http://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ JSR292:支持动态类型语言(InvokeDynamic) 近 年来越来越多的基于 JV ...

  4. Dubbo 2.7新特性之异步化改造

    这是why技术的第1篇原创文章 我与Dubbo的二三事 我是2016年毕业的,在我毕业之前,我在学校里面学到的框架都是SSH,即struts+spring+hibernate,是的你没有看错,在大学里 ...

  5. JDK-7新特性,更优雅的关闭流-java try-with-resource语句使用

    前言 公司最近代码质量整改,需要对大方法进行调整,降低到50行以下,对方法的深度进行降低,然后有些文件涉及到流操作,很多try/catch/finally语句,导致行数超出规范值,使用这个语法可以很好 ...

  6. C# 1.0 新特性之异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  7. .NET4.5新特性之异步编程(Async和Await)的使用

    一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个"主题".即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语 ...

  8. JDK7新特性try-with-resources语句

    try-with-resources语句是一种声明了一种或多种资源的try语句.资源是指在程序用完了之后必须要关闭的对象.try-with-resources语句保证了每个声明了的资源在语句结束的时候 ...

  9. C++2.0新特性(八)——<Smart Pointer(智能指针)之unique_ptr>

    一.概念介绍 unique_ptr它是一种在异常发生时可帮助避免资源泄露的smart pointer,实现了独占式拥有的概念,意味着它可确保一个对象和其他相应资源在同一时间只被一个pointer拥有, ...

随机推荐

  1. 自己动手开发Socks5代理服务器

    一.Socks5协议简介 socks5是基于传输层的协议,客户端和服务器经过两次握手协商之后服务端为客户端建立一条到目标服务器的通道,在传输层转发TCP/UDP流量. 关于socks5协议规范,到处都 ...

  2. python爬虫:抓取下载电影文件,合并ts文件为完整视频

    目标网站:https://www.88ys.cc/vod-play-id-58547-src-1-num-1.html 反贪风暴4 对电影进行分析 我们发现,电影是按片段一点点加载出来的,我们分别抓取 ...

  3. mysql基本操作【重要】

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAuYAAAVeCAIAAACyxWmSAAAgAElEQVR4nOydT0wbV/vvZzm7YXd2zI ...

  4. AF_INET域与AF_UNIX域socket通信原理对比

    原文 1.  AF_INET域socket通信过程 典型的TCP/IP四层模型的通信过程. 发送方.接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的 ...

  5. SQLServer xp_instance_regread returned error 5,Access is denied(配置最小权限)

    公司一套智能巡检系统,客户需要最小的权限去给这套系统使用:配置完后发现很多权限报错,有一条是关于xp_instance_regread读系统注册表error 5的报错.常理error 5.是属于系统权 ...

  6. Project Euler Problem2

    Even Fibonacci numbers Problem 2 Each new term in the Fibonacci sequence is generated by adding the ...

  7. 07 Go 1.7 Release Notes

    Go 1.7 Release Notes Introduction to Go 1.7 Changes to the language Ports Known Issues Tools Assembl ...

  8. jenkins主从从服务器发布脚本执行成功但总提示失败 FATAL: Remote call on XXXX failed

    主从jenkins当调用 slave 执行编译脚本后提示如下错误,找了半天怎么也没有问题,后来忽然发现slave上java的版本和master不同,一个 1.8 一个 1.10,将slave降回1.8 ...

  9. CAS单点登录流程

    CAS的官方站点: https://apereo.github.io/cas/5.2.x/index.html 概念解读: The TGT (Ticket Granting Ticket), stor ...

  10. Intellij Idea启用Git可视化界面

    第一步. 第二步. 然后点击OK 验证