我正在努力了解一般的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;
    }
}

09-28 07:40