【杂谈】从实现角度看ChannelFuture

JDK中的Future特性

在介绍Netty的ChannelFuture之前,我们先来看看JDK中的Future是如何实现的。总的来说就是任务提交的时候会使用装饰器模式,将任务包装成一个FutureTask。当执行器执行该Task的时候,不仅仅会执行用户提交的任务,还会执行装饰器添加的额外操作,例如在执行之前记录当前执行线程、执行完成后将任务结果保存在FutureTask对象内部等。

【杂谈】从实现角度看ChannelFuture

【杂谈】从实现角度看ChannelFuture

Thread runner   =>  装饰器添加的,在执行任务之前,会在对象内保存当前执行线程的引用,用于中断任务执行

Object outcome => 任务执行结果(返回值或异常对象),任务执行完成后会将结果set到此对象的outcome,后续可通过Future的get接口取出

Callable<V> callble => 用户提交的实际任务

WaitNode waiters => 用于保存等待线程,任务完成后会唤醒这些线程

详细请看本人过去整理的随笔:

揭开Future的神秘面纱——任务取消

揭开Future的神秘面纱——任务执行

揭开Future的神秘面纱——结果获取

Netty中的ChannelFuture

ChannelFuture是在Future基础上的完善,它支持添加监听器,在任务完成后自动执行相关操作。

这个其实就是观察者模式,个人认为就是在前面的C部分添加监听的方法调用,即执行线程执行完成后,如果发现该任务上有监听器,则该执行线程还会调用监听器接口。

话不多说,我们来看看它代码到底是怎么写的,跟Future的实现有何异同。相关实现关键内容在DefaultPromise类中,相对于前面的FutureTask。

1.对象属性

private volatile Object result; private final EventExecutor executor; private Object listeners; private short waiters; private boolean notifyingListeners;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysjyd.html