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

JDK7新特性<八>异步io/AIO

    博客分类:
  • jdk7
阅读更多

 

概述

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

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

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

 

范例

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

 

      服务端程序 Sever.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版本)

 

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版本)

 

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);

 

 

总结

       本文只是对jdk7aio使用做了一个简单的说明。至于其性能提升多少,如何改进现有的网络应用程序,还在摸索中。这里推荐一个比较成熟的网络框架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

4
1
分享到:
评论

相关推荐

    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 . . . . . . . .

    jdk10+ java.lang.NoClassDefFoundError: javax/xml/ws/Service 错误

    &lt;groupId&gt;javax.activation&lt;/groupId&gt; &lt;artifactId&gt;javax.activation-api&lt;/artifactId&gt; &lt;version&gt;1.2.0&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;javax.xml.bind&lt;/groupId&gt; &lt;artifactId&gt;jaxb-api&lt;/...

    aspose-words-15.8.0-jdk16.jar.rar

    新增: 利用itext7将html转pdf, 添加依赖: &lt;dependency&gt; &lt;groupId&gt;com.itextpdf&lt;/groupId&gt; &lt;artifactId&gt;itext7-core&lt;/... &lt;artifactId&gt;commons-io&lt;/artifactId&gt; &lt;version&gt;1.3.2&lt;/version&gt; &lt;/dependency&gt;

    itext-2.1.7.js7.jar

    &lt;version&gt;2.1.7.js7&lt;/version&gt; &lt;scope&gt;compile&lt;/scope&gt; &lt;optional&gt;false&lt;/optional&gt; &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;org.bouncycastle&lt;/groupId&gt; &lt;artifactId&gt;bcmail-jdk15on&lt;/artifactId&gt; &lt;/exclusion&gt; ...

    hadoop mapreduce wordcount

    &lt;artifactId&gt;jdk.tools&lt;/artifactId&gt; &lt;version&gt;1.8&lt;/version&gt; &lt;scope&gt;system&lt;/scope&gt; &lt;systemPath&gt;${JAVA_HOME}/lib/tools.jar&lt;/systemPath&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;junit&lt;/groupId&gt; ...

    XmlConverJSON.java

    &lt;classifier&gt;jdk15&lt;/classifier&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;jdom&lt;/groupId&gt; &lt;artifactId&gt;jdom&lt;/artifactId&gt; &lt;version&gt;1.0&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;xom&lt;/groupId&gt; ...

    二级(Java语言程序设计)考试大纲

    &lt;font size="3"&gt;&lt;font color="#ff0000"&gt;考试内容 &lt;br /&gt;&lt;/font&gt;&lt;strong&gt;一、Java语言的特点和实现机制&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二、Java体系结构&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1.JDK目录结构。&lt;br /&gt;2.Java的API结构...

    Java程序员考试

    &lt;br/&gt;&lt;br/&gt;考试细则:&lt;br/&gt;&lt;br/&gt;考试名称:&lt;br/&gt; The Sun Certified Java Programmer for JDK 1.1&lt;br/&gt; &lt;br/&gt;考试号:&lt;br/&gt; 310-022(IBM考生除外),310-023(只对IBM考生)&lt;br/&gt; &lt;br/&gt;推荐教材:&lt;br/&gt; SL-275 "Java ...

    aspose-words-18.8-jdk16-crack.jar

    &lt;Signature&gt;sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=&lt;/Signature&gt; ...

    JSP图书管理系统

    &lt;td width="7"&gt;&lt;/td&gt; &lt;td width="605"&gt;&lt;/td&gt; &lt;td width="7"&gt;&nbsp;&lt;/td&gt; &lt;td width="36" rowspan="9" valign="top"&gt;&lt;img src="image/z1.jpg" width="36" height="1006"&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td height="108" ...

    aspose-words-16.8.0-jdk16.jar 亲测可用版,无水印

    &lt;Signature&gt;sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=&lt;/Signature&gt; ...

    maven 配置注意事项

     &lt;id&gt;tomcat7&lt;/id&gt;  &lt;username&gt;admin&lt;/username&gt;  &lt;password&gt;admin&lt;/password&gt; &lt;/server&gt; 3.配置jdk环境(注意是jdk,不能是jre)下载java jdk,并安装java jdk。下载地址:...

    maven中 引入jar报错:Missing artifact net.sf.json-lib:json-lib:jar:2.4

    &lt;dependency&gt; &lt;groupId&gt;net.sf.json-lib&lt;/groupId&gt; &lt;artifactId&gt;json-lib&lt;/artifactId&gt; &lt;version&gt;2.4&lt;/version&gt; &lt;classifier&gt;jdk15&lt;/classifier&gt; &lt;/dependency&gt; 或者直接下载这个包

    spring boot2快速导出excel的java工具类demo源码:export-excel

    &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi-ooxml&lt;/artifactId&gt; &lt;version&gt;RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi&lt;/artifactId&gt; ...

    建行互联网被扫支付接口Socket商户验签jar包

    &lt;value&gt;55533&lt;/value&gt; &lt;/commport&gt; &lt;!-- 通讯端口1024~65535之间未被使用的端口 --&gt; &lt;maxconn&gt; &lt;value&gt;5&lt;/value&gt; &lt;/maxconn&gt; &lt;!-- 可按照不同的柜台号配置不同的公钥 --&gt; &lt;merpos&gt; &lt;!-- 商户柜台号 --&gt; ...

    Word转PDF aspose-words-21.11-jdk17.jar 和示例

    &lt;systemPath&gt;${project.basedir}/src/main/resources/lib/aspose-words-21.11-jdk17.jar&lt;/systemPath&gt; &lt;/dependency&gt; 2.刷新依赖后,复制提供的java示例代码,修改代码中你要转换的Word的文件的路径,然后直接...

    真正的JSP API CHM格式

    &lt;br/&gt;&lt;br/&gt;JavaServer Pages API Documentation&lt;br/&gt;&lt;br/&gt;Servlet API Documentation &lt;br/&gt;&lt;br/&gt;TLDDoc Generated Documentation&lt;br/&gt;&lt;br/&gt;JSTL JavaDoc&lt;br/&gt;&lt;br/&gt;并打包制作为方便查阅的CHM文档,内容涵盖JSP ...

    JDK6API中文参考手册[完美版][chm格式][修正重新上传]---part1

    白天由于网络问题 导致上传失败 现重新打包上传 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;*************************************************&lt;br/&gt;完美CHM文档,方法索引、搜索、书签、树形Contents一应俱全&lt;br/&gt;&lt;br/&gt;根据Sun 公司完整发布...

    SpringBoot2:SpringBoot2学习探究

    SpringBoot2核心技术 SpringBoot2入门 环境要求 Java8及以上 Maven 3.3及以上: : maven设置 &lt; mirrors&gt; &lt; mirror&gt; &lt; id&gt;nexus-aliyun&lt;/ id&gt; &lt; mirrorOf&gt;central&lt;/ mirrorOf&gt; ... &lt; id&gt;jdk-1.8&lt;/ id&gt;

    Java 2核心技术 卷II:高级特性(第七版).part2

    &lt;br&gt;http://images.amazon.cn/7/71111790130914730-fm.jpg&lt;br&gt;&lt;br&gt;【原 书 名】 Core Java 2, Volume II--Advanced Features (7th Edition) &lt;br&gt;【原出版社】 Prentice Hall PTR &lt;br&gt;【作 者】(美)Cay S.Horstmann...

Global site tag (gtag.js) - Google Analytics