2

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

像这样的状态机的常用方法

状态机示例

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

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

例子:

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 内发生的任何事情都是不可见的

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

4

4 回答 4

5

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

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

于 2010-01-07T12:51:55.447 回答
2

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

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

于 2014-01-14T21:35:39.633 回答
1

您还可以使用锁定和条件(Java 1.5+)。就像wait/notify在javadoc中有一个例子

于 2010-01-07T13:28:09.150 回答
1

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

于 2010-01-07T13:43:54.860 回答