AIO是异步IO的缩写,即Asynchronized。NIO在网络操作中,提供了非阻塞的方法,但NIO的IO行为还是同步的,对于NIO来说,业务线程是在IO操作准备好时得到通知,然后由这个线程自行进行IO操作,IO操作本身还是同步的。
AIO不是在IO准备好时再通知线程,而是在IO操作已经提交完成后,再给线程发出通知。AIO是完全不会阻塞的,此时业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。
1、AIO EchoServer实现
AIO EchoServer实现AsynchronousServerSocketChannel.accept()方法会立即返回,它不会真的等待客户端的到来。其方法签名:
accept()定义第一个参数是一个附件,可以是任意类型,作用是让当前线程和后续的回调方法可以共享信息,它会在后续调用中传递给handler。第二个参数是CompletionHandler接口,包含了public void completed(AsynchronousSocketChannel result, Object attachment)和public void failed(Throwable exc, Object attachment)方法,分别在异步操作成功或失败时回调。
AsynchronousServerSocketChannel.accept()实际做了两件事,一是发起accept请求,告诉系统可以开始监控端口了。二是注册CompletionHandler实例,一旦有客户端连接,如果成功连接就去执行completed(),否则执行failed()方法。
当completed()执行时,意味着有客户端成功连接了。AsynchronousSocketChannel.read()也是异步方法,它不会等待读取完成后再返回,而是立即返回,返回结果是一个Future对象。AsynchronousSocketChannel.write()不会等待数据全部写完,也是立即返回,同样返回Future对象。
服务器在进行下一个客户端连接准备时,会关闭当前正在处理的客户端连接,在关闭之前,先确保之前的write()操作已经完成,因此使用Future.get()进行等待。
调用start()方法开启服务器,由于start()使用的是异步方法,它会立即返回,并不会进行等待。若想让程序驻守执行,则必须加等待语句,否则start()结束,主线程就会退出。
2、AIO EchoClient实现
AIO EchoClient实现 服务端结果 客户端结果--参考文献《实战Java高并发程序设计》
网友评论