我一直在努力理解wait(),notify()和synchronized方法的用法。我有这个例子,它不起作用。其他一些对象调用dataHasChanged()
,它将实例变量datachanged
的值更改为true
。然后,使用notifyAll()
,等待的线程将检查值datachanged
。到现在为止还挺好。但是:当在while(!datachanged)
中检查时,datachanged
的值是false
。所以,我认为,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();
}
}
请注意''this'上调用'notifyAll()'。在你的'dataHasChanged()'中,这是一个与'refresh()'不同的对象。另外,考虑做'datachanged'' volatile'。 –
你有多少个线程正在运行(使用函数refresh()),你是如何定义“datachanged”的? –
@Andreas M.每个外部类的实例只有一个Refresher-Thread正在运行。 datachanged是私有的volatile布尔值。 –