2

変更を待機している状態でスレッドを保持する方法はありますか?つまり、何かが発生するまで待つことを意味します(varの変更、メソッドの呼び出しなど)。おそらく、イベントリスナー、または同期されたオブジェクト/メソッドを使用する必要があります。

このようなステートマシンの通常のアプローチ

ステートマシンの例

これは、シングルスレッド(およびGUIなし)アプリケーションで機能するdo {..} while(true)ループを使用しますが、スレッドでは使用できません..(少なくともすべてのスレッドステートマシンにコアを使用する必要があります) )。

したがって、プロセッサがタスクを消費することを避けるために、単純な(そして醜い)方法は「定期的なチェッカー」です。つまり、Sleepを追加することは、同期されたオブジェクトを定義し、スレッドSleepの代わりにwaitを使用することです。

例:

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でキューに入れられたステートマシンを指定すると、このためのコードが生成されます。キューに入れられたものとしてアンプルステートマシンを指定すると、イベント(名前付きメソッド呼び出し)を待機するスレッドが具体的に作成されます。クラス内の他のコードは、元のスレッドで同時に発生する可能性があります。キーワード「queued」は、ステートマシンの定義の直前に配置する必要があります。

Umpleでのステートマシンの作成の詳細については、http: //statemachines.umple.orgを参照してください。このコンテキストでは、UmpleをJava(および他の言語)の単なるプリプロセッサーと見なすことができます。

于 2014-01-14T21:35:39.633 に答える
1

Lock and Condition(Java 1.5以降)を使用することもできます。のようなものwait/notifyで、javadocに例があります

于 2010-01-07T13:28:09.150 に答える
1

イベントソーススレッドとFSM実施形態スレッドの間にパイプを使用してみてください。これは、2スレッドの実装には十分です。

于 2010-01-07T13:43:54.860 に答える