「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」。
一、简介
在netty当中,我们需要进行异步处理的时候,经常会调用以下的两个方法:
Future & Promise
其实在我们使用JDK的时候,就知道有一个Future接口,用于异步时接收任务结果。
在Netty当中,基于JDK当中的Future接口,进行了扩展;后面又在Netty的Future基础之上,增加了Promise接口。
关于三者的关系请看以下的类图:
- JDK Future:只能同步等待任务结束(无论成功还是失败)才能得到结果。
- Netty Future:可以同步等待任务结束得到结果,也可以异步方式得到结果,前提是任务必须要结束。
- Netty Promise:不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器。
二、扩展了哪些主要能力?
在这一章节,主要分析前面提到的netty新增的两个接口都新增了哪些功能。
功能/名称 | jdk Future | netty Future | Promise |
---|---|---|---|
cancel | 取消任务 | - | - |
isCanceled | 任务是否取消 | - | - |
isDone | 任务是否完成,不能区分成功失败 | - | - |
get | 获取任务结果,阻塞等待 | - | - |
getNow | - | 获取任务结果,非阻塞,还未产生结果时返回 null | - |
await | - | 等待任务结束,如果任务失败,不会抛异常,而是通过 isSuccess 判断 | - |
sync | - | 等待任务结束,如果任务失败,抛出异常 | - |
isSuccess | - | 判断任务是否成功 | - |
cause | - | 获取失败信息,非阻塞,如果没有失败,返回null | - |
addLinstener | - | 添加回调,异步接收结果 | - |
setSuccess | - | - | 设置成功结果 |
setFailure | - | - | 设置失败结果 |
三、使用示例
下面针对Promise我们重点学习,看看针对不同场景下的使用。
例1 同步处理任务成功
1 | csharp复制代码 public static void main(String[] args) throws ExecutionException, InterruptedException { |
结果:
1 | less复制代码main, start... |
例2 异步处理任务成功
1 | arduino复制代码 public static void main(String[] args) throws ExecutionException, InterruptedException { |
结果:
1 | arduino复制代码main, start... |
例3 同步处理任务失败 sync & get
sync或者get,区别是get会对异常信息再包一层
1 | scss复制代码 public static void main(String[] args) throws ExecutionException, InterruptedException { |
结果:
1 | less复制代码main, start... |
例4 同步处理任务失败 await
1 | scss复制代码 public static void main(String[] args) throws ExecutionException, InterruptedException { |
结果:
1 | csharp复制代码main, start... |
例5 异步处理任务失败
1 | scss复制代码 public static void main(String[] args) { |
结果:
1 | csharp复制代码main, start... |
例6 await 死锁检查
1 | csharp复制代码 public static void main(String[] args) { |
结果:
1 | less复制代码1 |
本文转载自: 掘金