新的异步功能的关键点,它们是Channel 类的一些子集,Channel 在处理IO操作的时候需要被切换成一个后台进程。一些需要访问较大,耗时的操作,或是其它的类似实例,可以考虑应用此功能。
在这里,我们只单独讲解针对文件IO操作的 AsynchronousFileChannel,但是需要注意的是,还有一些其他的异步管道。这里包括:

  • AsynchronousFileChannel:针对文件;
  • AsynchronousSocketChannel :针对客户端的socket;
  • AsynchronousServerSocketChannel:针对服务器端的异步socket,用来接收到来的连接。

针对异步管道的交互有两种不同的方式,

  1. Future 风格;
  2. callback 风格。

Future 风格的异步操作

这里需要使用Future 接口, 它可以被认为是一个正在进行的任务,也可能是尚未完成的任务。它有两个关键的方法:

isDone()
  返回一个布尔值来表示任务是否已经完成。
get()
  返回结果。如果任务完成,立即返回。否则,一直堵塞,直到完成。
让我们看段关于读取一个内容比较大的文件,或许超过100M的一个异步操作:

    try(AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("input.txt"))) {
ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024 * 100);
Future<Integer> result = channel.read(buffer, 0); while(!result.isDone()) {
// do some other useful work
System.out.println("reading file, I can do other work.");
}
System.out.println("Bytes read: " + result.get());
} catch (IOException | InterruptedException | ExecutionException e) {
e.printStackTrace();
}

callback 风格的异步操作

  基于callback风格的异步操作需要 CompletionHandler的帮忙,它定义了两个方法, completed() 和failed(),分别用来表示在回调结束后是否完成和失败。
这种风格特别适用于,你想在异步IO操作中立即知道事件的通知。例如,如果在云中有大量的I O操作,但任何单一操作的失败不一定是致命的。看例子。

        byte[] data = { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
ByteBuffer buffer = ByteBuffer.wrap(data); CompletionHandler<Integer, Object> handler = new CompletionHandler<Integer, Object>() {
@Override
public void completed(Integer result, Object attachment) { // success
System.out.println("Bytes written: " + result);
} @Override
public void failed(Throwable exc, Object attachment) { // failed
System.out.println("Asynch write failed: " + exc.getMessage());
}
}; try (AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("primes.txt"),
StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { channel.write(buffer, 0, null, handler); Thread.sleep(10000); // Needed so we don't exit too quickly
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}

  AsynchronousFileChannel 与后台线程池相连接,所以当初始线程处理其他任务的时候,以至于IO操作能够得以进行。
默认情况下,这种情况实际是管理一个运行时环境提供了的线程池,如果有需要,可以通过应用程序(通过重载 AsynchronousFileChannel.open()方法)创建一个自定义的线程池,不过这种情况通常不是必要的。
  另外,在nio 中还支持多重IO,这样就可以使一个单线程管理多个IO管道和检查它的哪些IO管道是否做好了读取和写入的准备,支持此操作的一些类在 java.nio.channels包下,包括 SelectableChannel 和 Selector。

Java 异步 IO的更多相关文章

  1. Java异步IO/NIO

  2. Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

    Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...

  3. 异步IO与回调

    最好了解 Java NIO 中 Buffer.Channel 和 Selector 的基本操作,主要是一些接口操作,比较简单. 本文将介绍非阻塞 IO 和异步 IO,也就是大家耳熟能详的 NIO 和 ...

  4. Java知识回顾 (9) 同步、异步IO

    一.基本概念 同步和异步: 同步和异步是针对应用程序和内核的交互而言的. 同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪: 而异步是指用户进程触发IO 操作以后便开始做自己的 ...

  5. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  6. Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1

    Paip.Php  Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1       异步调用的实现以及角色(:调用者 提货单) F ...

  7. JAVA中IO技术:BIO、NIO、AIO

    1.同步异步.阻塞非阻塞概念        同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...

  8. 伪异步IO理解

    伪异步IO实在堵塞IO的基础上将每个client发送过来的请求由新创建的线程来处理改进为用线程池来处理.因此避免了为每个client请求创建一个新线程造成的资源耗尽问题. 来看一下伪异步IO的服务端代 ...

  9. Java 网络 IO 模型

    在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...

随机推荐

  1. 深度学习框架Caffe的编译安装

    深度学习框架caffe特点,富有表达性.快速.模块化.下面介绍caffe如何在Ubuntu上编译安装. 1. 前提条件 安装依赖的软件包: CUDA 用来使用GPU模式计算. 建议使用 7.0 以上最 ...

  2. 多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习

    谢谢Andrew老师!谢谢Coursera!谢谢自己!希望这是一个好的开始!希望自己也能使用机器学习来make a better world...  

  3. SpringMVC轻松学习-环境搭建(二)

    基于spring2.5的采用XML配置的spring MVC项目 注:本项目全部基于XML配置.同时,集成了hibernate.采用的是:spring MVC+hibernate+spring的开发架 ...

  4. 前端设计——js实现图片切换的淡入淡出

    1.网页结构如图所示 2.页面布局设计细节 ①分块:一个小方块是一个div. ②无序列表一般是竖直排放的,可以通过float让其水平排放.float:left; ③三个小方块是浮动上去的,所以要用到p ...

  5. CodeForces 622B The Time

    水题. #include <stdio.h> #include <algorithm> #include <string.h> #include <queue ...

  6. 25、手把手教你Extjs5(二十五)Extjs5常用组件--form的基本用法

    Extjs Form是一个比较常用的控件,主要用来显示和编辑数据的,今天这篇文章将介绍Extjs Form控件的详细用法,包括创建Form.添加子项.加载和更新数据.验证等. Form和Form Ba ...

  7. 现在开始使用 ES6

    ECMAScript已经在2015年6月正式发布了,这门语言一直保持稳定快速的发展而且新功能也在慢慢被现在主流的 JavaScript 引擎所接受.不过要想在浏览器端或者 Node 端直接运行 ES6 ...

  8. phpmyadmin数据库导入大小限制的修改

    1.遇到导入过大文件时,首先检查php.ini 配置文件中的以下三个地方,upload_max_filesize, memory_limit 和post_max_size,并且推荐修改的值要稍大于导入 ...

  9. C缺陷与陷阱----读书笔记---第一章

    第一章:词法陷阱 编译器中负责将程序分解为一个一个符号的部分,一般称为“词法分析器”.例如,对于语句: if ( x == big ) big = x ; 它的第一个符号是C语言关键字if,紧接着下一 ...

  10. Unity3D ——强大的跨平台3D游戏开发工具(一)

    众所周知,Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎.在现有的版本中,其强大的游戏制作功能已 经达到让人瞠目结舌的地步.尤其是它在3.0版本里面制作的那款 ...