![Netty权威指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/711/47378711/b_47378711.jpg)
2.4.3 AIO版本时间服务器运行结果
执行TimeServer,运行结果如图2-15所示。
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/73_1.jpg?sign=1738823822-CV7Ns5GXGyxyMtlpvpeIZugX2xdBMeau-0-16ed15b3c2bba6e010205d602600a632)
图2-15 AIO时间服务器服务端运行结果
执行TimeClient,运行结果如图2-16所示。
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/74_1.jpg?sign=1738823822-86ikQ7levwKV6Iek7b2vSDQVATdZgkCg-0-125508babe8b0380a5d50acbe39e6aae)
图2-16 AIO时间服务器客户端运行结果
下面我们继续看下JDK异步回调CompletionHandler的线程执行堆栈。
![](https://epubservercos.yuewen.com/1F677E/26763860101459606/epubprivate/OEBPS/Images/74_2.jpg?sign=1738823822-1GPJgKzGgGyg3MiypjQxANUqiTRNybbn-0-9c27257b6334f71192ccedc8f54dadca)
图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模型。