在更改变量时通知等待线程

时间:2014-02-19 13:47:15

标签: java multithreading

我一直在努力理解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();
    }


}

1 个答案:

答案 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;            
    }
}