Netty入门学习(九):Netty的Future与JDK的Future学习

143 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

背景
  1. 理解在一个异步编程中的Future含义(JDK)。会存在缺陷。

  2. 事件驱动的异步编程的Future的含义(Netty)。添加监听器逻辑(观察者设计模式)。


理解
  1. Netty的Future与JDK的Future的核心类继承体系结构图 在这里插入图片描述
JDK 的Future学习
  1. Future定义 代表异步计算的结果。

  2. 提供的功能 检测计算是否已经完成; 阻塞等待计算的完成; 获取异步计算结果;

  3. 使用范例1 在这里插入图片描述 这里的代码逻辑过程是:异步执行serarch()方法;然后程序继续往下执行其他逻辑;最后程序调用future.get()方法阻塞等待

这里其实是有一个缺陷:就是get()方法调用者,不知道什么时候,这个异步方法成功执行并返回Future

  1. 使用范例2 在这里插入图片描述
Netty的Future学习
  1. Future定义 一个异步操作的结果。(在Netty中所有的I/O操作全是异步的)

  2. 提供的功能 :细化了JDK 的Future的功能 判断是否成功,而不是是否完成方法;添加监听器逻辑。

  3. ChannelFuture接口对其功能进行了完整的描述。尤其是I/O操作过程的状态变更,及其添加的监听器逻辑过程。


JDK的Future VS Netty的Future
Future状态变更是否有监听器
JDK状态变更控制不细致,异步完成:取消,成功,失败没有
Netty状态变更控制不细致,异步完成:取消,成功,失败

JDK中的Future只提供了isDone()方法,它只是告诉程序异步操作是否完成,而它的完成包含3个情况,取消完成,成功完成和失败完成,都是isDone()等于true的情况。所以它控制是不精准的。而Netty中的Future对其进行了更加细化的状态控制。

从范例1中可以理解到get()这个阻塞方法,会浪费很多等待的时间,因为程序并不能精确知道异步操作什么时候完成。而Netty中添加了监听器逻辑,就可以精准地知道异步操作完成,立即执行后续逻辑,而无需阻塞等待异步执行结果。


小结
  1. 一个异步编程,一定要基于事件的发生,采用监听器逻辑去实现。这是一个最佳实践。

  2. 监听器的实现是观察者设计模式的实践。

  3. 理解Netty的Future在JDK的Future之上丰富了功能逻辑。