【问题标题】:Threaded State Machines in JavaJava中的线程状态机
【发布时间】:2010-01-07 12:41:38
【问题描述】:

有没有办法让线程处于等待更改的状态? 我的意思是等待发生某些事情(更改 var、调用方法等) 也许它需要使用事件监听器,或者同步对象/方法..

这种状态机的常用方法

statemachine example

这使用了一个 do{..}while(true) 循环,该循环可以用于单线程(并且没有 GUI)应用程序,但它不能与线程一起使用。 (至少你想为每个线程状态机使用一个核心)

因此,以一种简单(且丑陋)的方式避免该处理器消耗任务 是一个“定期检查器”,我的意思是添加一个睡眠 另一个想法是定义一个同步对象并使用等待而不是线程睡眠

示例:

do{
    Switch(state)
    {         
        case STATE_A:
            //..A things                         
            break;

        case STATE_B:
            //..B things                         
            break;

        ...

        case STATE_Z:
            //..Z things                         
            break;
    }
    // Here!  =>   wait()?  Thread.sleep(TIME_CONST)? //Hold and yield
}while(powerOn);

缺点是使用同步增加了复杂性,或者在 TIME_CONST 内发生的任何事情都将是不可见的

我想知道这样做的其他想法, 谢谢!

【问题讨论】:

    标签: java multithreading switch-statement synchronized state-machine


    【解决方案1】:

    是的,您将使用wait/notify。这就是它的用途。

    或者也许你的状态机不需要有自己的线程。当有趣的事情发生时,其他线程可以调用状态机上的update 方法。

    【讨论】:

    • 我明白了,我认为很复杂,是最简单的方法!谢谢
    【解决方案2】:

    如果您在 Umple 中指定 queued 状态机,那么将为您生成此代码。将 umple 状态机指定为 queued 会专门创建一个等待事件(命名方法调用)的线程。类中的其他代码可以在原始线程中同时发生。关键字“queued”应该放在状态机定义之前。

    有关在 Umple 中创建状态机的更多信息,请参阅 http://statemachines.umple.org。在这种情况下,您可以将 Umple 视为 Java(和其他语言)的预处理器。

    【讨论】:

    【解决方案3】:

    您还可以使用 Lock 和 Condition (Java 1.5+)。就像wait/notify 并且在 javadoc 中有一个示例

    【讨论】:

      【解决方案4】:

      尝试在事件源线程和 FSM 实施线程之间使用Pipe。这对于 2 线程实现来说已经足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 2017-10-23
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多