我正在摆脱等待:
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 循环条件所以它再次入睡,虚假唤醒应该不是问题。
我的猜测对吗?代码清晰吗?我不是错过了什么应该得到更好的对待吗?我希望不是。感谢您的回复。