1. 前言
本节主要讲解 ChannelFuture ,它的作用是用来保存 Channel 异步操作的结果,可以看作是一个异步操作结果的占位符。
2. 概念
在 Netty 中所有的 IO 操作都是异步的,不能立刻得到 IO 操作的执行结果,但是可以通过注册一个监听器来监听其执行结果。在 Java 的并发编程当中可以通过 Future 来进行异步结果的监听,但是在 Netty 当中是通过 ChannelFuture 来实现异步结果的监听。通过注册一个监听的方式进行监听,当操作执行成功或者失败时监听会自动触发注册的监听事件。
3. 应用场景
ChannelFture 在开发当中经常需要用到,可以用来监听客户端连接服务端的结果反馈,Netty 是异步操作,无法知道什么时候执行完成,因此可以通过 ChannelFuture 来进行执行结果的监听。在 Netty 当中 Bind 、Write 、Connect 等操作会简单地返回一个 ChannelFuture。
4. 核心方法
序号 |
方法 |
描述 |
1 |
addListener |
注册监听器,当操作已完成 (isDone 方法返回完成),将会通知指定的监听器;如果 Future 对象已完成,则通知指定的监听器 |
2 |
removeListener |
移除监听器 |
3 |
sync |
等待异步操作执行完毕 |
4 |
await |
等待异步操作执行完毕 |
5 |
isDone |
判断当前操作是否完成 |
6 |
isSuccess |
判断已完成的当前操作是否成功 |
7 |
isCancellable |
判断已完成的当前操作是否被取消 |
8 |
cause |
获取已完成的当前操作失败的原因 |
sync () 和 await () 都是等待异步操作执行完成,那么它们有什么区别呢?
- sync () 会抛出异常,建议使用 sync ();
- await () 不会抛出异常,主线程无法捕捉子线程执行