私は待っている:
public void run() {
while(!running) {} //active waiting
//some action after running is true
}
私のコード:
class MyThread implements Runnable {
protected boolean running = false;
public Object lock = new Object();
@Override
public void run() {
while(!running) {
synchronized(lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}//end lock
}
//main job which will be done when the flag running is true
}//end run
public void managerStateChanged (Manager m) {
if(m.getState() == 1) {
this.running = true;
synchronized(lock) {
lock.notify();
}
}
}
}
class Manager {
protected MyThread listener = null;
protected int state = 0;
public int getState() { return state; }
public void registerListener(MyThread l) {
listener = l;
}
public void managerStateChanged() {
if(listener != null) {
listener.managerStateChanged(this);
}
}
}
編集:
1)すべての場合-これを使用するときは注意してください。wait()とnotify()の両方を同期ブロックでラップする必要があります。そうしないと、コードにそれがあり、この例外検索を再度取得すると、IlegalMonitorExceptionが発生します。おそらく、この同期ブロックなしで別の通知を別の場所で呼び出します。コメントに感謝します。
2)私のコードは大丈夫だったので質問を修正しましたが、sh **が発生し、どこかで何かを削除するのを忘れていました。これはうまくいっています。質問は私の実装が正しいですか?
私が完全に確信していない点がいくつかあります:
- 私は待機によってアクティブな待機を取り除き、いくつかのオブジェクトに通知します
- プログラムの評価が while ループになると、スレッドはオブジェクトでスリープ状態になり、スレッドは何でも実行し、アクティブな待機はパッシブな待機に置き換えられるため、CPU にとってははるかに優れています。
- Manager で状態の変更が発生し、対応するメソッド managerStateChanged() が呼び出されると、スリープ状態のスレッド MyThread で同じメソッドが呼び出され、待機中の状態であるかどうかを確認します。そうでない場合は、スレッドがまだスリープ状態である場合、実行中のフラグが変更され、スレッドが起動され、while ループ条件がループではなくなり、受動的な待機から抜け出し、スレッドは while ループの後に有用なコードを続行します。
- 考慮すべきもう1つのことと、その偽のウェイクアップがあります。通知する前にスレッドをウェイクアップできるということです。これがここで問題にならないことを願っています。なぜなら、受動的なwhileループ条件を通知する前にスレッドがウェイクアップした場合、まだ満たされていないからです。そのため、再びスリープ状態になり、偽のウェイクアップは問題になりません。
これについての私の推測は正しいですか?コードは明確ですか?もっとよく扱われるべきものを見逃していませんか?ないことを願っています。返信ありがとうございます。