2019独角兽企业重金招聘Python工程师标准>>>

概述
    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
    Java代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;  public class Server {  private AsynchronousServerSocketChannel server;  public Server()throws IOException{  server = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8888));  }  public void start() throws InterruptedException, ExecutionException, TimeoutException{  Future<AsynchronousSocketChannel> future = server.accept();  AsynchronousSocketChannel socket = future.get();  ByteBuffer readBuf = ByteBuffer.allocate(1024);  socket.read(readBuf).get(100, TimeUnit.SECONDS);  System.out.printf("Receiver:%s%n",new String(readBuf.array()));  }  public static void main(String args[]) throws Exception{  new Server().start();  }
}

客户端程序 (Future版本)
    J ava代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.ExecutionException;  public class AIOClientWithFuture {  private final AsynchronousSocketChannel client;  public AIOClientWithFuture() throws IOException{  client = AsynchronousSocketChannel.open();  }  public void sendMsg() throws InterruptedException, ExecutionException{  client.connect(new InetSocketAddress("localhost",8888));  client.write(ByteBuffer.wrap("test".getBytes())).get();  }  public static void main(String...args) throws Exception{  AIOClientWithFuture client = new AIOClientWithFuture();  client.sendMsg();  }
}

客户端程序(CompleteHandler版本)
     Java代码:

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;  public class AIOClientWithHandler {  private final AsynchronousSocketChannel client ;  public AIOClientWithHandler() throws Exception{  client = AsynchronousSocketChannel.open();  }  public void start()throws Exception{  client.connect(new InetSocketAddress("127.0.0.1",8888),null,new CompletionHandler<Void,Void>() {  @Override  public void completed(Void result, Void attachment) {  try {  client.write(ByteBuffer.wrap("test".getBytes())).get();  } catch (Exception ex) {  ex.printStackTrace();  }  }  @Override  public void failed(Throwable exc, Void attachment) {  exc.printStackTrace();  }  });  }  public static void main(String args[])throws Exception{  new AIOClientWithHandler().start();  }
}

相关类说明:
    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】新特性(1)概述:http://my.oschina.net/zhengjian/blog/94467
【JDK7】新特性(2)语法:http://my.oschina.net/zhengjian/blog/94473
【JDK7】新特性(3)JDBC4.1:http://my.oschina.net/zhengjian/blog/95070
【JDK7】新特性(4)NIO2.0 文件系统:http://my.oschina.net/zhengjian/blog/95071
【JDK7】新特性(5)fork/join 框架:http://my.oschina.net/zhengjian/blog/95072
【JDK7】新特性(6)监听文件系统的更改:http://my.oschina.net/zhengjian/blog/95077
【JDK7】新特性(7)监听文件系统的更改:http://my.oschina.net/zhengjian/blog/95078
【JDK7】新特性(8)异步io/AIO:http://my.oschina.net/zhengjian/blog/95081

原文地址: http://janeky.iteye.com/blog/1073695

转载于:https://my.oschina.net/zhengjian/blog/95081

【JDK7】新特性(8) 异步io/AIO相关推荐

  1. jdk7新特性学习笔记

    jdk7新特性学习笔记 从网络down了视频看,记录下学过的东西. 1.二进制字面量 JDK7开始,可以用二进制来表示整数(byte,short,int和long),语法:在二进制数值前面加 0b或者 ...

  2. 浮点数,字符串入门,基本数据类型自动转换,JDK7新特性, 变量.

    8.1 浮点型 **√ **float**类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求. √ ****double表示这种类型的数值精度是floa ...

  3. JDK7新特性之try-with-resources

    JDK7新特性之try-with-resources 本节内容并非JDK8的新特性,而是JDK7的新特性.此处讲解是因为多数人并不知道. 传统方式在资源关闭时,需要对每个需要关闭的资源进行 手动调用c ...

  4. JDK7新特性详细说明及代码示例

    在2011年7月28日,Oracle发布了JDK7的正式版.最近我从网上搜集了一些资料,把文字说明和代码示例结合起来,方便我们的学习. 下面我们来看看JDK7比6多了哪些新特性 1.访问文件系统 与之 ...

  5. Flink教程(22)- Flink高级特性(异步IO)

    文章目录 01 引言 02 异步IO 2.1 异步IO介绍 2.2 使用Aysnc I/O的前提条件 2.3 Async I/O API 03 案例演示 04 原理深入 4.1 AsyncDataSt ...

  6. Flink(54):Flink高级特性之异步IO(Async I/O)

    目录 0. 相关文章链接 1. 异步IO概述 1.1. 异步IO操作的需求 1.2. 使用Aysnc I/O的前提条件 1.3. Async I/O API 2. 案例展示 2.1. 需求 2.2. ...

  7. JDK7新特性简单翻译介绍

    « 家庭特点里程碑 · 建立 日历 » JDK 7中 特点 这是由甲骨文正在开发的功能,和其他列表中,JDK 7中. 这些功能将建议列入中的Java SE 7平台JSR ,除了为实现特定的上市的. 评 ...

  8. .NET 6新特性试用 | 异步流

    前言 IAsyncEnumerable<T>支持返回异步迭代的枚举器,但在.NET 6之前,即使在API中使用了IAsyncEnumerable<T>,它还是使用同步方式输出, ...

  9. 【Java8新特性--->异步处理】CompletableFuture

    一.引入 假设一个商品详情页需要以下操作: 查询展示商品的基本信息耗时:0.5s 查询展示商品的销售信息耗时:0.7s 查询展示商品的图片信息耗时:1s 查询展示商品销售属性耗时:0.3s 查询展示商 ...

最新文章

  1. Linux创建线程时 内存分配的那些事
  2. 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
  3. c语言如何跟进自定义赋值,用最简单的C语言编写自定义函数之数字后移
  4. webpack从零开始第2课: 配置文件
  5. 【重庆】2021年下半年软考报考时间及通知
  6. iOS属性传值传递不过去
  7. firefox无法显示验证码
  8. 软件测试设计与开发,软件测试技术·测试设计与开发.ppt
  9. python中线程和进程_python中线程和进程的简单了解
  10. Ajax-基础篇(持续更新01)
  11. mariadb用户群体mysql_MySQL/MariaDB用户账户管理
  12. 前端开发中的性能那点事(三)php的opcode缓存
  13. mongodb java驱动_Java的MongoDB驱动及读写策略
  14. 通过XMPP协议实现推送信息
  15. 《Python Cookbook》笔记_列表等可迭代对象的解压赋值
  16. STM32 HAL库 时钟芯片RX8025T IIC的读写操作,入过的坑
  17. 智能车竞赛技术报告-单车赛题组-同济大学
  18. Docker容器-------dockerfile概念简介
  19. l13Nginx创建负载均衡
  20. Linux网易云问题(高分屏)

热门文章

  1. verilog报错汇总(2)
  2. WARNING: Device for PV 0lQ0Gl-RBe5-fPrr-OKYB-whwD-qHPF-izvEES not found or rejected by a filter
  3. linux系统应用实验DNS的安装,DNS配置实验小结
  4. ctr 平滑_根据样本数进行点击率CTR的修正 - Wilson CTR
  5. linux系统数据库服务器配置,Linux安装配置MariaDB数据库全程详解
  6. 关于x86、x86-64、x64、i386、i486、i586和i686等名词的解释
  7. java 判断 子集_java – 获取集合子集的策略
  8. img预加载获取图片大小方法
  9. 计算机编程 寒假项目总结,我的软件工程之路--寒假总结
  10. 嵌入式项目管理学习——001重点明确和心态转换