我一直在努力理解wait(),notify()和synchronized方法的用法。我有以下示例,它不起作用。其他一些对象调用dataHasChanged()
,它将实例变量datachanged
的值更改为true
。然后,使用notifyAll()
,等待的线程检查datachanged
的值。到现在为止还挺好。但是:在datachanged
中签入时,false
的值为while(!datachanged)
。所以,我认为,datachanged = true
不知何地没有注册我的Refresher-Object。我做错了什么?
public synchronized void dataHasChanged(){
datachanged = true;
notifyAll();
}
class Refresher extends SwingWorker<Void, Void>{
public synchronized void refresh(){
while(!datachanged){
try {
wait();
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
}
setRights();
datachanged = false;
}
@Override
protected Void doInBackground() throws Exception {
refresh();
return null;
}
@Override
protected void done() {
refresher = new Refresher();
refresher.execute();
}
}
答案 0 :(得分:2)
wait(), notify(), notifyAll()
并对每个对象进行同步操作。在你的情况下,refresh()等待一个Refresh实例,notifyAll()
通知所有在你的外部类的实例上等待的对象。为此,必须在同一个对象上调用wait()和notifyAll()
(所以has(())。
以下内容对外部类的实例执行所有操作。
public void refresh(){
synchronized(WhateverYourOuterClass.this){
while(!datachanged){
try {
WhateverYourOuterClass.this.wait();
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
}
setRights();
datachanged = false;
}
}