主动等待替换 - 我的方法是否正确设计?

时间:2016-09-13 14:09:56

标签: java wait notify illegalmonitorstateexcep

我摆脱了等待:

 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()都必须包装在synchronized块中,否则会引发IlegalMonitorException,当你在代码中有它并且仍然再次获得此异常搜索时,可能会调用另一个没有这个同步块的地方通知。感谢评论。
2)我修改了问题,因为我的代码还可以,但是sh **发生了,我忘了在某处删除了一些东西。这工作正常。问题是我的实施正确吗?
有些观点我不太确定:

  • 我摆脱等待的积极等待并通知某个对象
  • 当程序评估进入while循环时,线程在对象上睡着了,线程确实做了什么,主动等待被被动等待取代,所以它对CPU来说要好得多。
  • 当管理器发生状态更改及其相应的方法managerStateChanged()被调用时,它在休眠线程MyThread上被调用相同的方法,它将检查它是否正在等待我们正在等待的状态,如果不是线程仍在休眠,如果是运行标志被更改并且线程被唤醒,while循环条件不再循环,我们跳出被动等待,并且线程在while循环之后继续其有用的代码
  • 还有一件事需要考虑和它的虚假唤醒,线程可以在通知之前被唤醒,我希望这不应该是问题,因为如果它在被通知之前被唤醒被动循环条件是仍然没有遇到所以它再次入睡,虚假醒来应该不是问题。

我猜对了吗?代码清楚了吗?我不想错过应该更好的待遇吗?我希望不是。感谢您的回复。

0 个答案:

没有答案