【JDK7】新特性(8) 异步io/AIO
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相关推荐
- jdk7新特性学习笔记
jdk7新特性学习笔记 从网络down了视频看,记录下学过的东西. 1.二进制字面量 JDK7开始,可以用二进制来表示整数(byte,short,int和long),语法:在二进制数值前面加 0b或者 ...
- 浮点数,字符串入门,基本数据类型自动转换,JDK7新特性, 变量.
8.1 浮点型 **√ **float**类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求. √ ****double表示这种类型的数值精度是floa ...
- JDK7新特性之try-with-resources
JDK7新特性之try-with-resources 本节内容并非JDK8的新特性,而是JDK7的新特性.此处讲解是因为多数人并不知道. 传统方式在资源关闭时,需要对每个需要关闭的资源进行 手动调用c ...
- JDK7新特性详细说明及代码示例
在2011年7月28日,Oracle发布了JDK7的正式版.最近我从网上搜集了一些资料,把文字说明和代码示例结合起来,方便我们的学习. 下面我们来看看JDK7比6多了哪些新特性 1.访问文件系统 与之 ...
- 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 ...
- 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. ...
- JDK7新特性简单翻译介绍
« 家庭特点里程碑 · 建立 日历 » JDK 7中 特点 这是由甲骨文正在开发的功能,和其他列表中,JDK 7中. 这些功能将建议列入中的Java SE 7平台JSR ,除了为实现特定的上市的. 评 ...
- .NET 6新特性试用 | 异步流
前言 IAsyncEnumerable<T>支持返回异步迭代的枚举器,但在.NET 6之前,即使在API中使用了IAsyncEnumerable<T>,它还是使用同步方式输出, ...
- 【Java8新特性--->异步处理】CompletableFuture
一.引入 假设一个商品详情页需要以下操作: 查询展示商品的基本信息耗时:0.5s 查询展示商品的销售信息耗时:0.7s 查询展示商品的图片信息耗时:1s 查询展示商品销售属性耗时:0.3s 查询展示商 ...
最新文章
- Linux创建线程时 内存分配的那些事
- 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
- c语言如何跟进自定义赋值,用最简单的C语言编写自定义函数之数字后移
- webpack从零开始第2课: 配置文件
- 【重庆】2021年下半年软考报考时间及通知
- iOS属性传值传递不过去
- firefox无法显示验证码
- 软件测试设计与开发,软件测试技术·测试设计与开发.ppt
- python中线程和进程_python中线程和进程的简单了解
- Ajax-基础篇(持续更新01)
- mariadb用户群体mysql_MySQL/MariaDB用户账户管理
- 前端开发中的性能那点事(三)php的opcode缓存
- mongodb java驱动_Java的MongoDB驱动及读写策略
- 通过XMPP协议实现推送信息
- 《Python Cookbook》笔记_列表等可迭代对象的解压赋值
- STM32 HAL库 时钟芯片RX8025T IIC的读写操作,入过的坑
- 智能车竞赛技术报告-单车赛题组-同济大学
- Docker容器-------dockerfile概念简介
- l13Nginx创建负载均衡
- Linux网易云问题(高分屏)
热门文章
- verilog报错汇总(2)
- WARNING: Device for PV 0lQ0Gl-RBe5-fPrr-OKYB-whwD-qHPF-izvEES not found or rejected by a filter
- linux系统应用实验DNS的安装,DNS配置实验小结
- ctr 平滑_根据样本数进行点击率CTR的修正 - Wilson CTR
- linux系统数据库服务器配置,Linux安装配置MariaDB数据库全程详解
- 关于x86、x86-64、x64、i386、i486、i586和i686等名词的解释
- java 判断 子集_java – 获取集合子集的策略
- img预加载获取图片大小方法
- 计算机编程 寒假项目总结,我的软件工程之路--寒假总结
- 嵌入式项目管理学习——001重点明确和心态转换