3

私は待っている:

 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ループ条件を通知する前にスレッドがウェイクアップした場合、まだ満たされていないからです。そのため、再びスリープ状態になり、偽のウェイクアップは問題になりません。

これについての私の推測は正しいですか?コードは明確ですか?もっとよく扱われるべきものを見逃していませんか?ないことを願っています。返信ありがとうございます。

4

0 に答える 0