背景
- 理解在一个异步编程中的Future含义(JDK)。会存在缺陷。
- 事件驱动的异步编程的Future的含义(Netty)。添加监听器逻辑(观察者设计模式)。
理解
- Netty的Future与JDK的Future的核心类继承体系结构图
JDK 的Future学习
-
Future定义
代表异步计算的结果。 -
提供的功能
检测计算是否已经完成;
阻塞等待计算的完成;
获取异步计算结果; -
使用范例1
这里的代码逻辑过程是:异步执行serarch()方法;然后程序继续往下执行其他逻辑;最后程序调用future.get()方法阻塞等待。这里其实是有一个缺陷:就是get()方法调用者,不知道什么时候,这个异步方法成功执行并返回Future。
-
使用范例2
Netty的Future学习
- Future定义
一个异步操作的结果。(在Netty中所有的I/O操作全是异步的) - 提供的功能 :细化了JDK 的Future的功能
判断是否成功,而不是是否完成方法;添加监听器逻辑。 - ChannelFuture接口对其功能进行了完整的描述。尤其是I/O操作过程的状态变更,及其添加的监听器逻辑过程。
JDK的Future VS Netty的Future
Future | 状态变更 | 是否有监听器 |
---|---|---|
JDK | 状态变更控制不细致,异步完成:取消,成功,失败 | 没有 |
Netty | 状态变更控制细致,独立处理:成功的,失败的,取消的 | 有 |
JDK中的Future只提供了isDone()方法,它只是告诉程序异步操作是否完成,而它的完成包含3个情况,取消完成,成功完成和失败完成,都是isDone()等于true的情况。所以它控制是不精准的。而Netty中的Future对其进行了更加细化的状态控制。
从范例1中可以理解到get()这个阻塞方法,会浪费很多等待的时间,因为程序并不能精确知道异步操作什么时候完成。而Netty中添加了监听器逻辑,就可以精准地知道异步操作完成,立即执行后续逻辑,而无需阻塞等待异步执行结果。
小结
- 一个异步编程,一定要基于事件的发生,采用监听器逻辑去实现。这是一个最佳实践。
- 监听器的实现是观察者设计模式的实践。
- 理解Netty的Future在JDK的Future之上丰富了功能逻辑。