質問

変更を待っている状態でスレッドを保持する方法はありますか?私は何かが起こるのを待つことを意味します(VARを変更し、メソッドを呼び出すなど)。おそらくイベントリスナーを使用する必要があります。

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

ステートマシンの例

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

そのため、そのプロセッサがタスクを消費するのを避けるために、シンプルな(そしてugい)方法は「定期的なチェッカー」です。他のアイデアを追加することは、スレッドスリープの代わりに同期オブジェクトを定義し、待機を使用することを意味します

例:

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);

欠点は、synchronized を使用すると複雑さが増すこと、または TIME_CONST 内で発生したことはすべて表示されなくなることです。

これを行うための他のアイデアを知りたいです、ありがとう!

役に立ちましたか?

解決

はい、あなたはwait / notifyを使用することでしょう。それはそれが何のためにあるのかである。

それとも、あなたのステートマシンは、独自のスレッドを持っている必要はありません。興味深い何かが起こるとき、他のスレッドはステート・マシン上のupdateメソッドを呼び出すことができます。

他のヒント

あなたがUmpleでのキューに入れられたが、のステートマシンを指定した場合は、

このためのコードを自動的に生成されます。具体的にキューに入れられたとしてumpleステートマシンを指定するイベント(名前付きメソッド呼び出し)を待機スレッドを作成します。クラス内の他のコードは、元のスレッド(S)で同時に起こることができます。キーワードはちょうどステートマシンの定義の前に置かれるべき「キューイング」ます。

Umpleにステートマシンを作成する方法の詳細については、 http://statemachines.umple.org のを参照してください。あなたは、この文脈でちょうどJava用のプリプロセッサ(および他の言語のための)としてUmple検討することができます。

ロックや 状態 (Java 1.5 以降)。まるで wait/notify Javadoc に例があります

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top