Future的语义
一个Future表示的一个异步操作的结果。
比如:
netty中的所有i/o操作都是异步的,这意味着所有的i/o操作都会立即返回,
返回给你一个ChannelFuture,这种Future是在i/o场景中的Future,
这个时候i/o操作不一定已经完成了;
ChannelFuture 会告诉你关于i/o操作的结果;
Future的状态
Future的状态有两种
- 未完成 uncompleted 当Future被创建的时候它的状态是未完成,因此此时异步操作还未开始
- 完成 completed 当异步操作已经完成了(成功、失败、被取消)
完成、未完成、成功、失败、被取消的关系如下图所示:
从Future获取异步操作的结果
Future提供了三种方式用于获取i/o结果
-
加监听器,GenericFutureListener
比如说加ChannelFutureListener,当异步操作完成,异步线程会回调监听器; -
同步等待 await方法,这个方法是同步的,调用这个方法,则调用线程会一直阻塞直到i/o操作完成,但相对监听器这种方式
系统花销更大,因为这里涉及的线程的阻塞和唤醒,并且可能会产生死锁,比如说在i/o的场景中:
在Channel处理器ChannelHandler中调用await,这样会产生死锁,因为正常情况下,Channel处理器中的方法都是在i/o线程中调用的 ,
如果此时调用了await方法,那么这个await方法可能永远都不会返回,因为你正等待的i/o操作所对应的那个i/o操作可能也在等你的i/o结果。
因此注意:
不要再ChannelHandler中调用await
await加超时操作,这里的超时和i/o超时是两回事
ChannelFuture的语义
表示的是一个异步i/o操作的结果,i/o场景下的Future
ChannelGroupFuture的语义
表示的一组异步i/o操作的结果
Promise的语义
Promise是一种特殊的Future,这种Future是可写的
ProgressiveFuture的语义
ProgressiveFuture是一种特殊的Future,这种Future可以用来表示异步操作的进度
ScheduledFuture
表示的是定时的异步操作的结果。
ChannelPromise
ChannelPromise表示的它是一种i/o场景下的Future,同时它又是可写的;
ChannelProgressiveFuture
ChannelProgressiveChannel表示的它是一种i/o场景下的Future,同时它又可以报告i/o进度
ProgressivePromise
ProgressivePromise表示的是一种可以报告进度的Promise
ChannelProgressivePromise
ChannelProgressiveChannel表示的它是一种i/o场景下的Promise,同时它又可以报告i/o进度