概述
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
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);
总结
本文只是对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系列的终结了,感谢大家的支持!更多的内容可以访问我的blog
http://www.iamcoding.com
分享到:
相关推荐
8. **JDK7新特性<八> 异步io/AIO** 异步I/O(Asynchronous Input/Output,AIO)提供了非阻塞的读写操作,使得应用程序在等待I/O完成时可以执行其他任务,从而提高了I/O密集型应用的性能。 综上所述,JDK7的新特性...
Java中的异步套接字编程,也称为非阻塞I/O(Non-blocking I/O, NIO)或异步I/O(Asynchronous I/O, AIO),是Java在JDK 7引入的一种高级I/O模型,它极大地提高了网络编程的效率。AIO的主要目标是提供一种方法,使得...
- **IO/NIO/BIO**:理解同步阻塞IO(BIO)、非阻塞IO(NIO)和异步IO(AIO)的区别和应用场景。 - **反射与动态代理**:学习如何在运行时检查类信息,创建对象,以及实现动态代理技术。 3. **编译器** - **javac...
`java.nio`和`java.nio.channels`包提供了非阻塞I/O功能,NIO.2(New I/O 2,也称为AIO)进一步增强了异步I/O的能力,如`AsynchronousFileChannel`和`AsynchronousServerSocketChannel`。 5. **Lambda表达式**: ...
- **定义**:AIO是一种异步非阻塞的IO模型,客户端的I/O请求由操作系统先完成,然后通知服务器应用启动线程进行处理。 - **适用场景**:适合连接数较多且连接时间较长的应用,如相册服务器。 - **特点**: - 充分...
- **工作原理**:AIO是JDK 1.7引入的新特性,它允许应用程序发起异步的读写请求,并通过CompletionHandler来接收完成的通知。 - **优缺点**: - **优点**:进一步提高了系统的并发能力,减少了对线程的依赖。 - ...
- 使用异步IO完成事件通知机制。 - 适用于连接数较多且连接较长的场景。 - JDK7开始支持。 - 编程较为复杂。 ##### 4.2 应用场景 - 大量长时间保持连接的场景,如相册服务器等。 - 需要充分利用操作系统并发...
随着JDK的发展,Java也在逐步引入异步I/O的支持,比如从JDK 1.4开始引入的NIO,再到JDK 7中加入的NIO.2,这些新特性极大地改善了Java网络编程的能力。 1. **NIO**:提供了Buffer、Channel等API,支持非阻塞I/O操作...
AIO(Asynchronous I/O)是一种异步非阻塞的IO模型,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理。AIO方式使用于连接数目多且连接比较长(重...
12. **JDK新特性**:对于较新的JDK版本,如Java 8、9、11等引入的新特性,如Lambda表达式、Stream API、Optional类等,面试官可能会有所考察。 以上就是华为Java程序员面试可能会涉及到的主要知识点。掌握这些内容...
- **IO流**:Java的IO流分为字节流和字符流,BIO是同步阻塞,NIO是同步非阻塞,AIO是异步非阻塞。 5. **容器** - **ArrayList和LinkedList**:ArrayList适合随机访问,不适合频繁插入删除;LinkedList适合插入...
AIO(Asynchronous I/O)是一种异步非阻塞的 IO 模式,服务器实现模式为一个有效请求一个线程,客户端的 I/O 请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理。这种方式使用于连接数目多且连接比较长...
aio(nio.2):JDK7 开始支持,异步非阻塞 IO。 apr:Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来 处理文件读取或网络传输操作,从而大大地 提高 Tomcat 对静态文件的处理性 能。 <!-- ...
AIO是在JDK1.7中引入的,基于异步IO思想来完成的。在AIO模式下,应用程序可以直接调用API的read或write方法,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法...
- **AIO (Asynchronous IO)**:从JDK 7开始支持,异步非阻塞I/O。适用于极高并发场景。 - **配置示例**: ```xml <Connector port="8080" protocol="org.apache.coyote....
AIO是JDK1.7中引入的真正意义上的异步非阻塞IO模型,服务器的实现模式为多个有效请求一个线程,客户端的IO请求都是由OS先完成再通知服务器应用去启动线程处理(回调)。AIO是Java中最先进的IO模型,它可以极大地提高...
9. **JDK8 新特性** - Lambda表达式:简化匿名内部类的编写。 - 接口的默认方法和静态方法:增加接口的灵活性。 - Stream API:提供一种序列处理数据的新方式,便于进行函数式编程。 - 方法引用来代替匿名内部类...