2.4.3 AIO版本时间服务器运行结果

执行TimeServer,运行结果如图2-15所示。

图2-15 AIO时间服务器服务端运行结果

执行TimeClient,运行结果如图2-16所示。

图2-16 AIO时间服务器客户端运行结果

下面我们继续看下JDK异步回调CompletionHandler的线程执行堆栈。

图2-17 AIO时间服务器异步回调线程堆栈

从“Thread-2”线程堆栈中可以发现,JDK底层通过线程池ThreadPoolExecutor来执行回调通知,异步回调通知类由sun.nio.ch.AsynchronousChannelGroupImpl实现,它经过层层调用,最终回调com.phei.netty.aio.AsyncTimeClientHandler$1.completed方法,完成回调通知。由此我们也可以得出结论:异步Socket Channel是被动执行对象,我们不需要像NIO编程那样创建一个独立的I/O线程来处理读写操作。对于AsynchronousServerSocket Channel和AsynchronousSocketChannel,它们都由JDK底层的线程池负责回调并驱动读写操作。正因为如此,基于NIO2.0新的异步非阻塞Channel进行编程比NIO编程更为简单。

本小节我们讲解了JDK1.7提供的新的异步非阻塞I/O(AIO)的用法,由于国内商用的主流Java版本仍然是JDK1.6,因此,本小节不再详细介绍NIO2.0其他新增的特性,如果大家对NIO2.0的异步文件操作等特性感兴趣,可以选择阅读JDK1.7的相关书籍或者查看甲骨文发布的JDK1.7白皮书。

下个小节我们对本章列举的5种I/O进行概念澄清和比较,让大家从整体上掌握这些I/O模型的差异,以便在未来的工作中能够根据产品的实际情况选择合适的I/O模型。