Future的继承体系

315 阅读2分钟

image.png

Future的语义

一个Future表示的一个异步操作的结果。

比如:

netty中的所有i/o操作都是异步的,这意味着所有的i/o操作都会立即返回,

返回给你一个ChannelFuture,这种Future是在i/o场景中的Future,

这个时候i/o操作不一定已经完成了;

ChannelFuture 会告诉你关于i/o操作的结果;

Future的状态

Future的状态有两种

  • 未完成 uncompleted 当Future被创建的时候它的状态是未完成,因此此时异步操作还未开始
  • 完成  completed 当异步操作已经完成了(成功、失败、被取消)

完成、未完成、成功、失败、被取消的关系如下图所示:

image.png

从Future获取异步操作的结果

Future提供了三种方式用于获取i/o结果

  1. 加监听器,GenericFutureListener

    比如说加ChannelFutureListener,当异步操作完成,异步线程会回调监听器;

  2. 同步等待 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进度