在应用中以任务的方式实现功能时,需要考虑到任务间的依赖关系。当任务强依赖上一个任务的结果时,任务间的消息通知就需要重视起来。任务间的消息通知分为同步和异步方式,同步就是消息的发送方要等待消息返回才能继续处理其他事情,而异步就是不需要等待消息返回而是通过条件变量、信号量、回调等方式实现消息通知。

JDK提供了 Future 来表示一个任务的执行结果。实现一个任务时需要实现 RunnableCallable 结果,Future 可以检测任务是否完成,获取任务的执行结果,取消任务等。Future 是一个任务的句柄,从Future 可以获取任务的状态和执行结果,即使这个结果可能立即可用或者未来某个时间可用。Promise 是一个可以写入结果或异常的对象,只能写入一次。Promise 表示 Future 的执行结果,成功或者异常。每个 Promise 关联一个 Future,对 Promise 进行写入会使 Future 的值可用。

Future和Promise来源于函数式语言,其目的是分离一个值和产生值的方法,从而简化异步代码的处理。

Netty中的Future

因为JDK的 Future 支持的功能比较简陋,Netty提供了 Future 的实现,扩展了 Future 的功能。

Netty中关于 Future 框架的实现位于 common 模块中,至于在 transport 中的扩展如 ChannelFuture这里没有涉及,那部分内容只是 Future 的应用。

从IDEA生成的类图来看Netty的关于 Future 的扩展有三类:

  1. Future -> AbstractFuture -> CompleteFuture -> FailedFuture,SucceededFuture。针对只需要关注任务的最终执行结果,中间不需要对任务执行成功或异常设置回调。AbstractFuture 提供了 get() 操作的实现,CompleteFuture 代表一个执行完毕的任务结果或异常。

  1. Netty的 Future 实现增加了添加和移除回调的方法,从而实现异步编程,回调或者说事件通知的实现是基于观察者模式。Future也支持同步获取结果,但是JDK的 Futureget() 操作从语义上来说是一个获取结果的方法,如果不是阅读文档完全获取不到这个方法会阻塞线程直到能够成功获取结果或抛出异常。Netty提供了 await()sync() 方法阻塞当前线程直到结果完成,从语义上来说 await() 用作需要等待任务完成,但是不需要获取任务执行结果或无结果,sync() 用作需要同步阻塞且需要获取结果的场景,当 sync() 执行结束后调用 get() 获取执行结果。

    Netty的 Promise 实现是通过继承 Future 实现的,在 Promise 中提供了设置任务执行结果的方法。在 DefaultPromise 中提供了实现,关于回调的实现是一个观察者模式的实现。在Netty的监听器接口的顶层接口是JDK的 EventListener 接口,这是JDK的事件通知接口,相关的还有事件对象的类定义 EventObject。值得注意的是回调地狱的问题,Netty默认回调的嵌套上限是8层。JDK8提供的 CompletableFuture 支持对 Future 进行计算,而不是 Future的结果从而解决了开发中需要用到的多重回调问题。

  2. Netty还提供了ProgressiveFutureProgressivePromise 抽象,这是为了解决任务处理不同的阶段需要进行不同的处理的问题,如下载任务,需要不断反馈下载进度,又或者如支持依赖的调度任务进行到不同阶段需要触发不同的任务执行。ProgressivePromise 主要增加了setProgress()tryProgress() 方法。

netty channelinactive触发条件_Netty的Future和Promise相关推荐

  1. netty socket超时设置_Netty 学习和进阶策略

    背景 Netty 框架的特点 Netty 的一个特点就是入门相对比较容易,但是真正掌握并精通是非常困难的,原因有如下几个: 涉及的知识面比较广:Netty 作为一个高性能的 NIO 通信框架,涉及到的 ...

  2. netty中的future和promise源码分析(二)

    前面一篇netty中的future和promise源码分析(一)中对future进行了重点分析,接下来讲一讲promise. promise是可写的future,从future的分析中可以发现在其中没 ...

  3. Netty ChannelInactive 断链场景分析

    本文档主要列举离会.关闭进程.断网.重连等会导致sdk与服务端断开连接的场景的设计与实现,并试图解释其原理 1.Netty断链场景分析 1. Netty对断链的处理 简单来说Netty在检测到断开连接 ...

  4. minor gc和Major GC,Full GC的触发条件

    Minor GC Minor GC指新生代GC,即发生在新生代(包括Eden区和Survivor区)的垃圾回收操作,当新生代无法为新生对象分配内存空间的时候,会触发Minor GC.因为新生代中大多数 ...

  5. GC详解及Minor GC和Full GC触发条件总结

    GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...

  6. Oracle DBWR,LGWR,CKPT,ARCH 触发条件 总结

    一.  DBWR写磁盘数据触发条件 1. 当进程在辅助LRU链表和主LRU链表上扫描以查找可以覆盖的buffer header[空闲缓冲区]时,如果已经扫描的buffer header的数量到达一定的 ...

  7. FD_WRITE触发条件

    FD_WRITE触发条件: 1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件 2.server通过accept(WS ...

  8. JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC: ...

  9. 从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)...

    jQuery语法 (1)引用jquery文件及下载库: http://jquery.com/download/ 下载 Download the compressed, production jQuer ...

最新文章

  1. 线程池的介绍及简单实现
  2. Windows组策略屏蔽U盘有妙法
  3. Redis进阶-布隆过滤器
  4. 分布式文件系统FastDFS架构剖析
  5. 店招模块终于可以进行后台换图片了
  6. 演练:在组件设计器中创建 Windows 服务应用程序
  7. 使用memcmp函数判断两个函数的前n位字节数是否相等
  8. output.properties data exceeds its limit [2048] HUE执行脚本异常
  9. 内向的人这样改善人际关系(四)
  10. NodeJS中使用SQLite3
  11. c语言程序设计实践教程编程题8.3,C语言程序设计教程(21世纪计算机科学与技术实践型教程)...
  12. 【UNITY3D 游戏开发之三】NGUI HUDTEXT 的练习源码及资源
  13. win10微信卡顿_WIN10下微信崩溃(已经是最新版)的解决方法
  14. CISP考试的全过程
  15. 大橙子主题vfed3.15模板
  16. 王道数据结构3.2.5——1、循环队列中设置tag区分头指针front和队尾指针rear相等时队列的状态是空还是满
  17. [知识普及]世界知名洋酒
  18. 怎么提取伴奏?只要三招即可快速搞定,附带详细教程
  19. 前端学习周报(第一周)
  20. Qt6实战教程:媒体播放器示例

热门文章

  1. html静态网页模板_aspnetcore 实现简单的伪静态化
  2. r420 raid linux,Dell R420 RAID建立以及系统安装
  3. 查看python安装位置图_python安装路径怎么找
  4. php手机网站底部导航代码,jQuery微信手机端底部弹出导航菜单列表代码
  5. java 解析标记语言_Java XML可扩展标记语言(eXtensible Markup Language)
  6. Java Swing Mysql学生成绩管理系统
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生选课系统
  8. 基于JAVA+SpringMVC+MYSQL的医院皮试管理系统
  9. 基于JAVA+SpringMVC+MYSQL的高校教师档案管理系统
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的车库管理系统