Java 异步 IO
新的异步功能的关键点,它们是Channel 类的一些子集,Channel 在处理IO操作的时候需要被切换成一个后台进程。一些需要访问较大,耗时的操作,或是其它的类似实例,可以考虑应用此功能。
在这里,我们只单独讲解针对文件IO操作的 AsynchronousFileChannel,但是需要注意的是,还有一些其他的异步管道。这里包括:
- AsynchronousFileChannel:针对文件;
- AsynchronousSocketChannel :针对客户端的socket;
- AsynchronousServerSocketChannel:针对服务器端的异步socket,用来接收到来的连接。
针对异步管道的交互有两种不同的方式,
- Future 风格;
- 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的更多相关文章
- Java异步IO/NIO
- Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO
Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...
- 异步IO与回调
最好了解 Java NIO 中 Buffer.Channel 和 Selector 的基本操作,主要是一些接口操作,比较简单. 本文将介绍非阻塞 IO 和异步 IO,也就是大家耳熟能详的 NIO 和 ...
- Java知识回顾 (9) 同步、异步IO
一.基本概念 同步和异步: 同步和异步是针对应用程序和内核的交互而言的. 同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪: 而异步是指用户进程触发IO 操作以后便开始做自己的 ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
Paip.Php Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1 异步调用的实现以及角色(:调用者 提货单) F ...
- JAVA中IO技术:BIO、NIO、AIO
1.同步异步.阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...
- 伪异步IO理解
伪异步IO实在堵塞IO的基础上将每个client发送过来的请求由新创建的线程来处理改进为用线程池来处理.因此避免了为每个client请求创建一个新线程造成的资源耗尽问题. 来看一下伪异步IO的服务端代 ...
- Java 网络 IO 模型
在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...
随机推荐
- 类似java.lang.NoClassDefFoundError: org/jaxen/JaxenException解决方法
在使用dom4j的xpath时出现java.lang.NoClassDefFoundError: org/jaxen/JaxenException的异常,原因是dom4j引用了jaxen jar包,而 ...
- 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
一个像素边框的表格: Info Header 1 Info Header 2 Info Header 3 Text 1A Text 1B Text 1C Text 2A Text 2B Text 2C ...
- 约瑟夫环(java面向对象实现)
/* * 作者:zhaop * 功能:约瑟夫环 * */ public class Joseph { public static void main(String[] args) { // TODO ...
- (译)Windsor入门教程---第二部分 引用Windsor
原文:http://docs.castleproject.org/Windsor.Windsor-tutorial-ASP-NET-MVC-3-application-To-be-Seen.ashx ...
- tcpdump的表达元
(nt: True 在以下的描述中含义为: 相应条件表达式中只含有以下所列的一个特定表达元, 此时表达式为真, 即条件得到满足) dst host host如果IPv4/v6 数据包的目的域是host ...
- eclipse创建Maven父子结构Maven项目
1.创建聚合模块 选择菜单项 File—>New—>Other,在弹出的对话框中选择Maven下的Maven Project,然后单击Next按钮,在弹出的New Maven Projec ...
- Redis详解
转自:http://blog.csdn.net/eroswang/article/details/7080412 1. MySql+Memcached架构的问题 1.MySQL需要不断进行拆库拆表, ...
- AnsiString用法(转)
源:AnsiString用法 //Ansistring 转 char void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiStrin ...
- Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
参考: 很郁闷,买来没多久的 STM32F4-DISCOVERY 就挂了? STM32F103RB Jlink调试的时候出现flash timeout.reset the target and t ...
- @synthesize和@dynamic
@synthesize 除非开发人员已经做了,否则由编译器自动生成getter/setter方法.当开发人员自定义存或取方法时,自定义会屏蔽自动生成该方法. @dynamic 告诉编译器,不自动生成g ...