netty-Future、Promise和Listener源码分析

1 netty Future的基本使用

编程语言中的future,顾名思义就是一个操作在将来才会完成,但是调用方不必同步等待结果,只要持有对应操作的future对象即可,等操作完成了,从future中获取结果。

netty Future是实现其异步非阻塞IO机制的重要对象。本文从演示netty Future的基本使用开始,再到源码角度分析其实现原理,最后剖析其在netty的异步非阻塞IO中如何使用。

netty Future在jdk Future的基础上进行了扩展,最主要的特色是提供了Listener机制,在future完成后回调listner执行用户指定的操作。其他特性主要是提供sync()方法,以等待future完成后再继续往后做其他事情。(如无特别说明,本文后续所说的future都特指netty future。)

  • future的基本使用方式举例:
public class TimeServerHandler extends ChannelInboundHandlerAdapter {
   

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
   
		final ChannelFuture cf = ctx.writeAndFlush(new UnixTime());
		cf.addListener(new ChannelFutureListener() {
   
			@Override
			public void operationComplete(ChannelFuture future) throws Exception {
   
				assert cf == future;
				ctx.close();
			}
		});
	}
}
  • future只有两种状态:未完成与完成,完成后需要用户自己判断future对应的操作最后是成功、失败还是取消:
 *                                      +---------------------------+
 *                                      | Completed successfully    |
 *                                      +---------------------------+
 *                                 +---->      isDone() = true      |
 * +--------------------------+    |    |   isSuccess() = true      |
 * |        Uncompleted       |    |    +===========================+
 * +--------------------------+    |    | Completed with failure    |
 * |      isDone() = false    |    |    +---------------------------+
 * |   isSuccess() = false    |----+---->      isDone() = true      |
 * | isCancelled() = false    |    |    |       cause() = non-null  |
 * |       cause() = null     |    |    +===========================+
 * +--------------------------+    |    | Completed by cancellation |
 *                                 |    +---------------------------+
 *                                 +---->      isDone() = true      |
 *                                      | isCancelled() = true      |
 *                                      +---------------------------+

2 netty Future实现的原理

2.1 netty Future的继承关系

在这里插入图片描述

  • 最上面是jdk Future,netty Future继承jdk Future,主要添加了以下几个接口方法:

— boolean isSuccess():判断操作是否成功;

— addListener/removeListener:用于添加删除监听器;

— sync/await:用于阻塞等待Future完成,当sync/await方法返回后,future完成。

  • Promise继承自Future,主要添加了如下几个方法,用于设置Future的结果:

— setSuccess(V result) / trySuccess(V result):设置future结果为成功;

— setFailure(Throwable cause) / tryFailure(Throwable cause):设置future结果为失败。

  • ChannelFuture继承自Future,添加了Channel channel()方法,用于获取执行IO操作的channel。
  • ChannelPromise基本是把Promise接口和ChannelFuture接口合并到一起的接口。

以上是整个Future类体系的概要

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值