状态机与状态机的设计

状态机就是状态转移图。

关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。

状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。

我们定义一个jobEvent

public class JobEvent extends AbstractEvent<JobEventType> {

    private String jobID;

    public JobEvent(JobEventType type,String jobID) {
        super(type);
        this.jobID=jobID;
    }

    public String getJobID() {
        return jobID;
    }

}

JobEventType:

package org.apache.hadoop.state;

public enum JobEventType {
    JOB_KILL,
    JOB_INIT,
    JOB_START,
    JOB_SETUP_COMPLETED,
    JOB_COMPLETED
}

作业内部状态JobStateInternal:

package org.apache.hadoop.state;

/**
 * 定义作业内部状态
 * @author joqk
 *
 */
public enum JobStateInternal {
    NEW,
    SETUP,
    INITED,
    RUNNING,
    SUCCEEDED,
    KILLED,
}

作业状态机JobStateMachine:

package org.apache.hadoop.state;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.hadoop.event.JobEvent;
import org.apache.hadoop.yarn.event.EventHandler;
import org.apache.hadoop.yarn.state.SingleArcTransition;
import org.apache.hadoop.yarn.state.StateMachine;
import org.apache.hadoop.yarn.state.StateMachineFactory;

public class JobStateMachine implements EventHandler<JobEvent> {

    private String jobID;

    private EventHandler eventHandler;
    private Lock writeLock=null;
    private Lock readLock=null;

    private StateMachine<JobStateInternal,JobEventType,JobEvent> stateMacthie;

    protected static final StateMachineFactory<JobStateMachine,JobStateInternal,JobEventType,JobEvent> stateMachineFactory =
            new StateMachineFactory<JobStateMachine,JobStateInternal,JobEventType,JobEvent>(JobStateInternal.NEW)
            .addTransition(JobStateInternal.NEW, JobStateInternal.INITED, JobEventType.JOB_INIT,new InitTranstion())
            .addTransition(JobStateInternal.INITED, JobStateInternal.SETUP, JobEventType.JOB_START,new StartTransition())
            .installTopology();

    public static class InitTranstion implements SingleArcTransition<JobStateMachine, JobEvent>{

        @Override
        public void transition(JobStateMachine job, JobEvent event) {
            System.out.println("receiving event "+event);

//            job.eventHandler.handle(new JobEvent(JobEventType.JOB_START,job.jobID));
            job.eventHandler.handle(new JobEvent(org.apache.hadoop.event.JobEventType.JOB_START, job.jobID));
        }

    }
    public static class StartTransition implements SingleArcTransition<JobStateMachine, JobEvent>{

        @Override
        public void transition(JobStateMachine job, JobEvent event) {
            System.out.println("receiving event "+event);

//            job.eventHandler.handle(new JobEvent(JobEventType.JOB_START,job.jobID));
//            job.eventHandler.handle(new JobEvent(JobEventType.JOB_SETUP_COMPLETED, job.jobID));
        }

    }

    public JobStateMachine(String jobID,EventHandler eventHandler){

        this.jobID = jobID;
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        this.readLock = readWriteLock.readLock();
        this.writeLock = readWriteLock.writeLock();

        this.eventHandler =eventHandler;
        stateMacthie = stateMachineFactory.make(this);

    }

    /**
     * 得到当前状态机
     * @return
     */
    protected StateMachine<JobStateInternal,JobEventType,JobEvent>  getStateMachine(){
        return stateMacthie;
    }

    /**
     * 获取作业内部状态的变化
     * @return
     */
    public JobStateInternal getInternalState(){
        readLock.lock();
        try{
            return getStateMachine().getCurrentState();
        }finally{
            readLock.unlock();
        }
    }

    @Override
    public void handle(JobEvent event) {
        try{
            writeLock.lock();
            JobStateInternal oldState = getInternalState();
            try{
                getStateMachine().doTransition(event.getType(), event);
            }catch(InvalidStateTranstitonException e){
                System.out.println("Can‘t handle thi event at current state ");
            }
            if(oldState != getInternalState()){
                System.out.println("JOb Transtitioned from "+oldState +"to"+getInternalState());
            }
        }finally{
            writeLock.unlock();
        }
    }

}

这样就完成了一个状态机的定义。

时间: 2024-08-28 13:40:57

状态机与状态机的设计的相关文章

【iCore3 双核心板_FPGA】例程九:状态机实验——状态机使用

实验指导书及代码包下载: http://pan.baidu.com/s/1o72i3mq iCore3 购买链接: https://item.taobao.com/item.htm?id=524229438677

用状态机来设计cell动画

前言 一个cell可能有好几种状态,比方说选中状态与未选中状态,以及失效状态等等状态,我们将这些不同的情形抽象成一个个状态机,用状态机切换逻辑来设计复杂的动画效果,达到简化设计的目的,大大增加程序可维护性. * 大家需要注意一点,cell因为是可以复用的控件,因为存在复用,所以里面存在较为恶心的复用逻辑,设计动画接口时是需要注意这些小细节的.(亲手写过的人一定会深有体会) 效果 源码 https://github.com/YouXianMing/CellStateAnimation // //

MiS603 开发板2.3 状态机设计

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ 2.3 状态机设计 状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路.通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机

【slighttpd】基于lighttpd架构的Server项目实战(8)—状态机机制回顾

有限状态机FSM(Finite State Machine) 关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成.状态机通过响应一系列事件而"运行".每个事件都在属于"当前" 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集.函数返回"下一个"(也许是同一个)节点.这些节点中至少有一个必须是终态.当到达终态, 状态机停止. 传统应用程序的控制流程基本是顺序的:遵循事先设定的逻辑,从头到尾地执行.很少有事

使用C++实现一套简单的状态机模型——实例

一般来说,"状态机"是一种表达状态转换变换逻辑的方法.曾经有人和我讨论过为什么不直接用ifelse,而要使用"状态机"去实现一些逻辑,认为使用"状态机"是一种炫技的表现.然而对于大型复杂逻辑的变化和跳转,使用ifelse将带来代码难以阅读等弊端.其实ifelse也是一种状态机实现的方式. 之前我们有个业务和操作系统有着强烈的关联,而我们希望比较清晰地描述整个业务中各个子业务的过程,就引入了状态机描述的方式.可是当时的状态机是使用if else方法

读卡器的状态机, python实现

1. 问题的提出,及状态机简介 ZHUMAO整了个门禁用的读卡器,比以前那种更好,不需要发指令就能读,只要刷卡,读卡器就向串口上写数据.仍然是串口的,还是韦根协议."刷卡就向上写"避免了轮询读卡器,效率更高,代码也容易了.不过,也造成一个问题.下发命令,然后轮询读的模式下,如果在串口线上只有一个读卡器,不需要对输入的数据特别检验和处理,接收到的数据一定是对的,按协议读入多少个字符,然后按偏移量取有效的部分就行了."刷卡就向上写"的模式,需要保证对齐,必须从刷卡后产生

技术系列之“状态机”

技术系列之“状态机” 作者: cppexplore  发布时间: 2015-09-13 11:03  阅读: 1194 次  推荐: 2                   原文链接   [收藏] 一.状态机描述 状态机理论最初的发展在数字电路设计领域.在数字电路方面,根据输出是否与输入信号有关,状态机可以划分为Mealy型和Moore型状态机:根据输出是否与输入信号同步,状态机可以划分为异步和同步状态机.而在软件设计领域,状态机设计的理论俨然已经自成一体.Moore型状态机的输出只和当前状态有

“状态机”学习笔记

Async和Await异步编程的原理 在上面的这个简单状态机中,调用者不需要知道状态机下一步要干什么,它只被告知在某个时候需要调用MoveNext,具体干什么由状态机的内部实现决定. 技术系列之“状态机” 与编译原理中的状态机不同,软件设计领域中通用状态机的输入不是字符集,而是被称作事件的结构(可以是结构体,也可以是类对象),并且特定的状态下,针对发生的事件,不仅发生状态改变,而且产生动作. 状态机思路在程序设计中的应用 状态机可归纳为4个要素,即现态.条件.动作.次态.这样的归纳,主要是出于对

游戏设计模式——状态机模式

前言:状态机模式是一个游戏常用的经典设计模式,常被用作处理一个生物的各种状态(例如行走,站立,跳跃等). 假如我们正在开发一款动作游戏,当前的任务是实现根据输入来控制主角的行为--当按下B键时,他应该跳跃. 直观的代码: if (input == PRESS_B) { if (!m_isJumping) { m_isJumping = true; Jump();//跳跃的代码 } } 后来我们需要添加更多行为了,所有行为如下: 站立时按下 ↓ 键 => 蹲下. 蹲下时按下 ↓ 键 => 站立.