Java のスレッド ステート マシン
-
19-09-2019 - |
質問
変更を待っている状態でスレッドを保持する方法はありますか?私は何かが起こるのを待つことを意味します(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ステートマシンを指定するイベント(名前付きメソッド呼び出し)を待機スレッドを作成します。クラス内の他のコードは、元のスレッド(S)で同時に起こることができます。キーワードはちょうどステートマシンの定義の前に置かれるべき「キューイング」ます。
Umpleにステートマシンを作成する方法の詳細については、 http://statemachines.umple.org のを参照してください。あなたは、この文脈でちょうどJava用のプリプロセッサ(および他の言語のための)としてUmple検討することができます。
ロックや 状態 (Java 1.5 以降)。まるで wait/notify
Javadoc に例があります
を使用してみてください パイプ イベント ソース スレッドと FSM 実装スレッドの間。2 スレッドの実装にはこれで十分です。