当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

Java AIO初探(异步网络IO)[Java编程]

赞助商链接



  本文“Java AIO初探(异步网络IO)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

按照《Unix网络编程》的划分,IO模子可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX尺度来划分只分为两类:同步IO和异步IO.若何辨别呢?首先一个IO操作其实分成了两个步骤:发动IO恳求和实际的IO操作,同步IO和异步IO的辨别就在于第二个步骤能否阻塞,假照实际的IO读写阻塞恳求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,假如不阻塞,而是操作系统帮你做完IO操作再将后果返回给你,那么就是异步IO.阻塞IO和非阻塞IO的辨别在于第一步,发动IO恳求能否会被阻塞,假如阻塞直到完成那么就是传统的阻塞IO,假如不阻塞,那么就是非阻塞IO.

Java nio 2.0的主要改良就是引入了异步IO(包含文件和网络),这里主要介绍下异步网络IO API的利用以及框架的计划,以TCP服务端为例.首先看下为了支持AIO引入的新的类和接口:

java.nio.channels.AsynchronousChannel

标志一个channel支持异步IO操作.

java.nio.channels.AsynchronousServerSocketChannel

ServerSocket的aio版本,成立TCP服务端,绑定地址,监听端口等.

java.nio.channels.AsynchronousSocketChannel

面向流的异步socket channel,表示一个衔接.

java.nio.channels.AsynchronousChannelGroup

异步channel的分组管理,目的是为了资源同享.一个AsynchronousChannelGroup绑定一个线程池,这个线程池履行两个任务:处理IO事件和派发CompletionHandler.AsynchronousServerSocketChannel成立的时刻可以传入一个 AsynchronousChannelGroup,那么通过AsynchronousServerSocketChannel成立的 AsynchronousSocketChannel将同属于一个组,同享资源.

java.nio.channels.CompletionHandler

异步IO操作后果的回调接口,用于定义在IO操作完成后所作的回调工作.AIO的API答应两种方法来处理异步操作的后果:返回的Future情势大概注册CompletionHandler,我更举荐用CompletionHandler的方法,这些handler的调用是由 AsynchronousChannelGroup的线程池派发的.明显,线程池的大小是性能的关键因素.AsynchronousChannelGroup答应绑定差别的线程池,通过三个静态办法来成立:

public static AsynchronousChannelGroup withFixedThreadPool(int nThreads,
                                                                ThreadFactory threadFactory)
         throws IOException
  public static AsynchronousChannelGroup withCachedThreadPool(ExecutorService executor,
                                                                 int initialSize)
  public static AsynchronousChannelGroup withThreadPool(ExecutorService executor)
         throws IOException

需求按照具体利用呼应调整,从框架角度动身,需求表露这样的配置选项给用户.

在介绍完了aio引入的TCP的主要接口和类之后,我们来假想下一个aio框架应当怎么计划.参考非阻塞nio框架的计划,普通都是采取Reactor情势,Reacot负责事件的注册、select、事件的派发;呼应地,异步IO有个Proactor情势,Proactor负责 CompletionHandler的派发,查看一个典型的IO写操作的流程来看二者的辨别:

Reactor:  send(msg) -> 消息行列能否为空,假如为空  -> 向Reactor注册OP_WRITE,然后返回 -> Reactor select -> 触发Writable,告诉用户线程去处理 ->先注销Writable(很多人碰到的cpu 100%的问题就在于没有注销),处理Writeable,假如没有完好写入,持续注册OP_WRITE.注意到,写入的工作还是用户线程在处理.

Proactor: send(msg) -> 消息行列能否为空,假如为空,发动read异步伐用,并注册CompletionHandler,然后返回. -> 操作系统负责将你的消息写入,并返回后果(写入的字节数)给Proactor -> Proactor派发CompletionHandler.可见,写入的工作是操作系统在处理,无需用户线程参与.事实上在aio的API 中,AsynchronousChannelGroup就扮演了Proactor的角色.

CompletionHandler有三个办法,辨别对应于处理成功、失利、被撤消(通过返回的Future)情形下的回调处理:

public interface CompletionHandler<V,A> {
      void completed(V result, A attachment);
     void failed(Throwable exc, A attachment);

     void cancelled(A attachment);
}


  以上是“Java AIO初探(异步网络IO)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .