阻塞、非阻塞、同步、异步概念
举个别人博客中看到的栗子:
如果你想吃一份宫保鸡丁盖饭:
同步阻塞: 你到饭馆点餐,然后在那等着,还要一边喊:好饭了没有啊!!!
**同步非阻塞:**在饭馆点完餐,就去遛狗了。不过溜一会,就回饭馆喊了一句:饭好了没啊!!!
**异步阻塞:**遛狗的时候,接到饭馆的电话,说饭做好了,让你亲自去拿
**异步非阻塞:**饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。
异步的处理
异步无非是通知系统做一些事情。告诉完系统后,自己做其他事情去了。很多时候系统做完某一件事情虎需要做一些后续的操作,怎么办呢?这时候就是告诉异步调用如何做后续处理。通常有两种方式:
- 将来式:当你希望主线程发起异步调用,并轮训等待结果的时候使用将来式;
- 回调式:常说的异步回调就是它。 以文件调用为例子:
回调式的基本思想是:主线程会派一个侦查员CompletionHandler
到独立的线程中执行IO操作。这个侦查员将带着IO的操作的结果返回到主线程中,这个结果会触发它自己的completed或者faild方法(要重写这两个方法)。在异步IO活动结束后,接口java.nio.channels.CompletionHandler
会被调用,该接口有两个方法completed(V,A)
和failed(V,A)
方法,其中V表示结果的类型,A是提供结果的附着对象。通过上述两个方法程序才能知道异步IO操作成功或者失败时该如何处理。
AIO引入的新类
-
java.nio.channels.AsynchronousChannel
- 标记一个channel支持异步IO操作
-
java.nio.channels.AsynchronousServerSocketChannel
- ServerSocket的aio版本,创建TCP服务端,绑定地址,监听端口等。
-
java.nio.channels.AsynchronousSocketChannel
- 面向流的异步socket channel,表示一个连接
-
java.nio.channels.AsynchronousChannelGroup
- 异步channel的分组管理,目的是为了资源共享。一个AsynchronousChannelGroup绑定一个线程池,这个线程池执行两个任务:处理IO事件和派发CompletionHandler。AsynchronousServerSocketChannel创建的时候可以传入一个AsynchronousChannelGroup。
-
java.nio.channels.CompletionHandler
- 异步IO操作结果的回调接口,用于定义在IO操作完成后所作的回调工作。AIO的API允许两种方式来处理一步操作的结果:返回的Future模式或者注册CompletionHandler。AsynchronousChannelGroup允许绑定不同的线程池。