Java AIO中异步操作基本流程
- 初始化资源:
- 创建
AsynchronousSocketChannel
或AsynchronousServerSocketChannel
等通道,例如通过AsynchronousSocketChannel.open()
打开一个异步套接字通道。
- 创建缓冲区
ByteBuffer
用于数据的读写,如ByteBuffer buffer = ByteBuffer.allocate(1024);
。
- 发起异步操作:
- 以读取操作为例,调用通道的异步读取方法,如
AsynchronousSocketChannel.read(ByteBuffer dst)
或AsynchronousSocketChannel.read(ByteBuffer dst, A attachment, CompletionHandler<Integer,? super A> handler)
。这里会立即返回,不会阻塞当前线程,操作在后台执行。
- 执行异步任务:
- 操作系统内核负责执行实际的I/O操作,如从网络读取数据到内核缓冲区,然后再将数据复制到用户空间的
ByteBuffer
中。
- 通知与处理:
- 当异步操作完成时,操作系统会通过回调机制通知应用程序。
- 应用程序根据注册的
CompletionHandler
来处理操作结果。
通过CompletionHandler处理异步操作结果
- 实现CompletionHandler接口:
- 实现
CompletionHandler<V, A>
接口,其中V
是操作结果的类型(例如对于读取操作V
通常是Integer
表示读取的字节数),A
是附加对象类型。
- 实现接口中的两个方法:
completed(V result, A attachment)
:当异步操作成功完成时调用,result
为操作结果,attachment
为发起异步操作时传入的附加对象。例如:
CompletionHandler<Integer, ByteBuffer> handler = new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
// 处理读取的字节数result,attachment是之前传入的ByteBuffer
attachment.flip();
byte[] data = new byte[attachment.remaining()];
attachment.get(data);
String message = new String(data);
System.out.println("Read message: " + message);
}
@Override
public void failed(Throwable exc, A attachment) {
// 处理操作失败情况,如打印异常信息
exc.printStackTrace();
}
};
- 注册CompletionHandler:
- 在发起异步操作时传入实现好的
CompletionHandler
实例,如AsynchronousSocketChannel.read(ByteBuffer dst, A attachment, CompletionHandler<Integer,? super A> handler)
,这样当操作完成时,系统会调用CompletionHandler
的相应方法来处理结果。