第三章 AIO
1. AIO概述
AIO 也叫NIO2.0 ,是一种
非阻塞异步
的通信模式。在NIO的基础上引入了新的异步通道
的概念,并提供了异步文件通道和异步套接字通道的实现。
2. AIO的设计原理
AIO的核心思想是:
去主函数等待时间
。异步channel API提供了两种方式监控/控制异步操作(connect, accept, read,write等)。第一种
方式是返回java.util.concurrent.Future对象,检查Future的状态可以得到操作是完成还是失败,还是进行中,future.get阻塞当前进程。第二种
方式为操作提供一个回调参数java.nio.channels.CompletionHandler,这个回调类包含completed、failed两个方法。
3. 代码解析
- 1)通过Future读取数据
这个Demo创建了一个AsynchronousFileChannel, 然后创建一个ByteBuffer,它被传递给read()方法作为参数,以及一个0的位置。在调用read()之后,这个示例循环,直到返回的isDone()方法返回true(
此处的循环可以使用futrue.get()方法将线程阻塞
)。当然,这不是非常有效地使用CPU,但是您需要等到读取操作完成之后才会执行。读取操作完成后,数据读取到ByteBuffer中,然后进入一个字符串并打印到System.out中。
- 2)通过CompletionHandler读取数据
一旦读取操作完成,将调用CompletionHandler的completed()方法。对于completed()方法的参数传递一个整数,它告诉我们读取了多少字节,以及传递给read()方法的“附件”。“附件”是read()方法的第三个参数。在本例中,它是ByteBuffer,数据也被读取。您可以自由选择要附加的对象。如果读取操作失败,则将调用CompletionHandler的failed()方法。
- 3)通过Future写数据
首先,AsynchronousFileChannel以写模式打开。然后创建一个ByteBuffer,并将一些数据写入其中。然后,ByteBuffer中的数据被写入到文件中。最后,示例检查返回的Future,以查看写操作完成时的情况。
- 4)通过CompletionHandler写数据
当写操作完成时,将会调用CompletionHandler的completed()方法。如果由于某种原因而写失败,则会调用failed()方法。
4. AIO【JDK 1.7】小结
AIO模型中通过AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道的实现。非阻塞,异步。