我正在努力了解一般的wait(),notify()和同步方法的用法。在下面的示例中,我无法正常工作。其他一些对象调用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();
}
}
最佳答案
wait(), notify(), notifyAll()
和每个对象的同步操作。在您的情况下,refresh()等待Refresh的实例,而notifyAll()
通知所有在您的外部类的实例上等待的对象。为此,必须在同一对象上调用wait()和notifyAll()
(synced()也是如此)。
下面的代码对您的外部类的实例执行所有操作。
public void refresh(){
synchronized(WhateverYourOuterClass.this){
while(!datachanged){
try {
WhateverYourOuterClass.this.wait();
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
}
setRights();
datachanged = false;
}
}