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循环后继续其有用的代码
  • 还有一件事需要考虑,它的虚假唤醒,线程可以在 notify 之前被唤醒,我希望这应该不是问题,因为如果它在 notify 之前被唤醒,仍然不满足被动 while 循环条件所以它再次入睡,虚假唤醒应该不是问题。

我的猜测对吗?代码清晰吗?我不是错过了什么应该得到更好的对待吗?我希望不是。感谢您的回复。

4

0 回答 0