面试题答案
一键面试Java AIO回调机制基本原理
- 异步I/O模型:Java AIO(Asynchronous I/O)基于Reactor模式,采用异步非阻塞I/O模型。在这种模型下,应用程序发起I/O操作后,不会阻塞等待操作完成,而是继续执行其他任务。当I/O操作完成时,系统会通过回调机制通知应用程序。
- 回调机制核心:主要涉及
Future
接口和CompletionHandler
接口。Future
接口用于获取异步操作的结果,应用程序可以通过调用Future
的方法(如get()
)阻塞等待结果,或者通过isDone()
方法轮询判断操作是否完成。CompletionHandler
接口则是一种更高效的方式,它定义了两个方法completed
和failed
。当I/O操作成功完成时,会调用completed
方法;当操作失败时,会调用failed
方法。操作系统在I/O操作完成后,会回调这些方法,通知应用程序操作的结果。
在简单文件读取业务场景中使用回调机制优化传统阻塞式I/O操作示例
- 引入必要的包
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.io.IOException;
- 实现文件读取回调处理
public class FileReadCallbackExample {
public static void main(String[] args) {
AsynchronousSocketChannel socketChannel = null;
try {
socketChannel = AsynchronousSocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
attachment.flip();
byte[] data = new byte[attachment.remaining()];
attachment.get(data);
String message = new String(data);
System.out.println("Received: " + message);
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
exc.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述示例中:
- 首先创建
AsynchronousSocketChannel
并连接到指定地址。 - 分配一个
ByteBuffer
用于读取数据。 - 调用
read
方法时,传入ByteBuffer
以及实现了CompletionHandler
接口的匿名内部类。 - 当数据读取完成时,
completed
方法会被调用,在该方法中处理读取到的数据;如果读取失败,failed
方法会被调用,在其中处理失败情况。这样就避免了传统阻塞式I/O操作中等待数据读取完成的阻塞,提高了程序的并发性能。