Java(Android)で、独自の状態を持つスレッドのカスタマイズされたバージョンを実装することは可能ですか?
つまり、ThreadAが実行状態にある間も、その状態を要求するThreadBによってポーリングできます。
e.g.
ThreadA.getState();
状態の値をいくつかのカスタム値に変更することは可能ですか?これらの2つのスレッド間に一種の基本的な通信システムを実装するにはどうすればよいですか?
ありがとう。
Java(Android)で、独自の状態を持つスレッドのカスタマイズされたバージョンを実装することは可能ですか?
つまり、ThreadAが実行状態にある間も、その状態を要求するThreadBによってポーリングできます。
e.g.
ThreadA.getState();
状態の値をいくつかのカスタム値に変更することは可能ですか?これらの2つのスレッド間に一種の基本的な通信システムを実装するにはどうすればよいですか?
ありがとう。
はい、可能です。以前のプロジェクトでこれをよく使用しましたが、必要なのはThread
クラスを拡張することだけです。
public class StateThread extends Thread{
String state = "ThreadState";
public synchronized void setState(String newState){
state = newState;
}
public synchronized String getState(){
return state;
}
@override
public void run(){
// Do stuff and update state...
}
}
はい、このタスクを実行することは可能です。
いいデザインですか?私はそうは思わない。
スレッド間の通信を実行する他の手段があります-
たとえば、プロデューサー/コンシューマーパターンのキューを使用する必要があります。
Androidは、JavaSEがスレッドローカルをサポートしているため、ローカルスレッドデータ(状態を含む)を管理するために使用できると確信しています(スレッドによって管理される状態を変更するための「操作」を取得するキューと組み合わせて使用することができ
ます。 setStateメソッドとgetStateメソッドを使用するソリューションを選択することを決定します。少なくとも、ReaderWriterLockを使用してロックを最適化することを検討してください。
スレッドの状態は、仮想マシンによって維持されます。VM は状態を使用して、実際のスレッドを監視および管理します。
そのため、スレッドの状態を変更するメカニズムはありません。setState
カスタム状態を設定できる機能はありません。
アプリケーションの目的のために、スレッドを拡張して独自のインスタンス変数を定義できますが、スレッドの状態を変更することはできません。
共有データとの同期は、スレッドの「状態」を判断するのにあまり役に立ちません。スレッドはその状態を「正常」と書き込み、スタックします。次に、監視スレッドが状態をチェックし、正常であると判断します。
「状態」を監視するということは、共有オブジェクトを直接見るだけでなく、チェックされたスレッドに何かをさせることを意味するはずです。
メッセージを渡す設計がある場合 (zaske で提案されているように)、すべてのスレッドの入力キューで「状態レコード」を渡し、その状態を内部に記録して次のスレッドに渡すように要求できます。「モニター」スレッドは、レコードが戻ってくるのを待ちます。すべてが入力されます。適切な時間内に取得できない場合は、取得したものをログに記録できます。状態レコード オブジェクトへの参照を保持するため、状態を確認できます。どのスレッドがその状態を更新していないか。おそらく、ウォッチドッグタイマーへの供給に失敗する可能性があります。