Future&Promise
什么是Future、promise?
- 首先要说明 netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展
- jdk Future 只能同步等待任务结束(或成功、或失败)才能得到结果
- netty Future 可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束
- netty Promise 不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器
作用:
将返回结果 和计算逻辑分离,目的是为了让计算逻辑不影响返回结果,从而抽象 出一套异步编程模型
使用场景
在Netty中所有的IO操作都是异步的,不能立刻得到IO操作的执行结果。如果我们要获取IO操作的结果,就需要注册一个监听器来监听其执行结果。在Java中的并发编程当中可以通过Future来进行异步结果的监听,但是在Netty当中时通过ChannelFuture来实现异步结果的监听。通过注册一个监听的方式来进行监听,当操作执行成功或者失败时监听会自动触发注册的监听事件。
ChannelFuture在开发当中时需要经常用到的,可以用来监听客户端连接服务端的结果反馈,Netty是异步操作,无法知道什么时候执行完成,因此可以通过ChannelFuture来进行执行结果的监听。在Netty当中的bind,writer,connect等操作都会简单的返回一个ChannelFuture。
jdk Future、netty Future、Promise功能比较
netty Future
Netty ChannelFuture
Netty Promise
Netty的Future,只是增加了监听器。整个异步的状态,是不能进行设置和修改的,于是Netty的 Promise接口扩展了 Netty的Future接口,可以设置异步执行的结果。在IO操作过程,如果顺利完成、或者发生异常,都可以设置Promise的结果,并且通知Promise的Listener们。
Netty ChannelPromise
ChannelPromise接口,则继承扩展了Promise和ChannelFuture。所以,ChannelPromise既绑定了Channel,又具备 了设置监听回调的功能,还可以设置IO操作的结果,是Netty实际编程使用的最多的接口。