好久不见,最近事情好多,越不写越不敢写,感觉等了这么久,要不要写得更好一些才能对得起自已。所以看的都是更深的问题,今天我尝试聊一下yarn的状态机设计,这块我不是第一天看了,之前也看了几天,虽然不是一直看,但是只要有时间都要看一点。这块还是很体现设计的。但是不好理解,更不好用语言来表达,所以我试着聊聊,不一定能说清楚。

下面我们就开始聊,首先咱们先说一下状态机是干啥的,这么个上古概念为什么hadoop这么流行的系统还在使用?先来回答第一个问题其实这个东西是很实用,也很基础的。在系统级开发中的作用很大,之前写c++的时候经常用到,只是java这块大家习惯了spring的产品化。

不多说了,我们看看状态机的实现吧,首先我们看一下StateMachine接口,这是个范性接口,里面定义了三个概念,如下所示:

STATE,状态

EVENTTYPE,事件类型

EVENT,事件

状态机就是状态的变化管理,所以STATE代理的就是这个状态,而EVENTTYPE代表的事件类型,也就是触发一个事件的条件,事件则是真正的处理逻辑。了解了这三个重要概念我们再看一下这个接口的重要方法:

STATE getCurrentState();

STATE doTransition(EVENTTYPE eventType, EVENT event);

getCurrentState这个大家一看就清楚是获取当前的状态,而doTransition则是最核心的状态变化,需要关注二点,第一是参数,这里的两个参数的做用就是接收到特定的事件类型,然后触发对应的事件。第二是返回值STATE,大家注意到了吧也就是执行完这个方法后会从之前的状态转变到另一个状态,以此来实现状态的转变。

了解了StateMachine接口,就知道了状态机要做什么。那么我们再看一个具体的实现类来了解hadoop中是如何实现StateMachine接口的。InternalStateMachine是在hadoop中的一个具体实现类,我们首先看一下他的成员都有哪些:

OPERAND operand;

STATE currentState;

StateTransitionListener listener;

Operand是操作对象,也就是状态机将控制的具体对象。currentState就是当前状态,listener这个是监听器,也就是在特定是时机通知相关对象的机制,这里可以先忽略。

接下来看一下核心方法doTransition方法,这里面最关键的就是下面这句。

currentState = StateMachineFactory.this.doTransition(

operand,

currentState,

eventType,

event);

首先他调用了StateMachineFactory中的doTransition方法去实际处理这个状态转化。这个方法返回的结果就是新的状态。

这里要解释一下StateMachineFactory.this的用法,这个在工场类中很常见。实现的目的就是可以在内部类中访问创建内部类的真实父类的方法,为什么这么绕着说呢,是因为类有可能多重派生。比如a继承b,b继承c。然后d是c中的内部类,当我用a去创建d的时候。this指代的是a而不是b。哎,能听懂的听懂,不能懂的也不影响,我们接着说状态机。

那么我们就要看一下StateMachineFactory类了。先来看一下他的主要成员:

TransitionsListNode transitionsListNode;

Map>> stateMachineTable;

其实这两个是一回事,transitionsListNode是一个单链表是用于生成stateMachineTable的。而stateMachineTable是一个二层的Map。第一层是状态与Map的映射。第二层是事件类型与Transition的的映射。通俗一点的解释,就是一个状态对就多个事件类型,不同的事件类型对应Transition类。这样我们就清楚了状态转换的内核原理。下面我们再来看一下Transition接口。很直接只有一个方法:doTransition。拿SingleInternalArc实现类来举例,我们看SingleInternalArc的成员有:

STATE postState;

SingleArcTransition hook;

postState就是这个转化的目的状态。而SingleArcTransition这个接口就是在这个转化中真实处理的逻辑。所有状态转化实现类都要实现这个接口。

到这,状态机的原理和关键代码已经讲完了。希望对喜欢代码的朋友有点帮助。其实在我们的实际工作中很多时候都可以用这个设计模式来解决问题。比如汽车有启动和停止两种状态。在停止状态下踩油门是没有用的,而在启动状态下足彩油门则可以加速。当然这样的例子很多。大家可以多思考,通过使用状态机可以使我们的代码更生动更易于理解。而且配合uml的状态图则会使这种设计更加直观。

java 状态机_Yarn的状态机机制相关推荐

  1. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  2. Java中的等待/通知机制(wait/notify)

    为什么80%的码农都做不了架构师?>>>    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...

  3. Java中事件监听机制

    Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...

  4. EJB与JAVA BEAN_J2EE的异步消息机制

    EJB与JAVA BEAN_J2EE的异步消息机制 EJB与JAVA BEAN的区别 Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个 ...

  5. Moore状态机和Mealy状态机的区别

    直接给出结论: 根据状态机的输出是否与输入条件相关来区分Moore状态机和Mealy状态机. Moore状态机:输出仅仅与当前状态有关: 如下实例,如三段式写法来写的一个序列检测的状态机([ FPGA ...

  6. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  7. ABAP和Java里关于DEFAULT(默认)机制的一些语言特性

    ABAP 740的新语法: 上图的代码相当于: DATA: ls_data LIKE LINE OF it_data. READ TABLE it_data INTO ls_data WITH KEY ...

  8. 深入分析 Java I/O 的工作机制

    深入分析 Java I/O 的工作机制 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代 ...

  9. Java 技术之垃圾回收机制

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 垃圾回收机制是 Java 非常重要的特性之一,也是面试题的常客.它让开发者无需关注空间的创建和 ...

最新文章

  1. 随笔:写给我深爱的球队
  2. android 摄像头预览左右镜像_OpenJDK镜像的tag说明
  3. [Forward] 因为火炬,所以迟到,工资照扣
  4. [免费网络研讨会] Java 11的第一印象
  5. oracle 全局id,基于SnowFlake 全局ID 生成器 go-id-worker
  6. Vue首屏性能优化组件
  7. python怎么画圆圈_python怎么画圆
  8. 华为switch上配置MSTP
  9. 一起谈.NET技术,asp.net控件开发基础(9)
  10. linux 联通ip配置,linux下设置电信网通双线路IP地址
  11. qt 雷达扫描障碍物_激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊
  12. python-RFM模型
  13. 微前端项目实战及原理
  14. 英语caement水泥
  15. 在 Laravel 中使用 Tailwind CSS
  16. Facade (外观)模式
  17. GoAhead_UserGuide_1
  18. 自动驾驶技术(2)--智能车辆导航技术概述
  19. 微信小程序之微票前后端简易版+五天实训总结
  20. 【小5聊】TortoiseGit代码管理之hint: Updates were rejected because a pushed branch tip is behind its remote

热门文章

  1. 【转】Ubuntu 安装截图工具Shutter,并设置快捷键 Ctrl+Alt+A
  2. matlab错误:vl_feat工具箱问题
  3. 科大星云诗社动态20210121
  4. 重磅!66 个机器学习硬核资源,请务必收藏!
  5. python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
  6. CMake1:HelloWorld
  7. [OS复习]设备管理3
  8. 上传文件时路径总是C:\fakepath\的问题
  9. 在asp.net中使用 log4net 笔记
  10. 编写好代码的10条戒律