在这种情况下使用.wait()和.notifyAll是不好的做法

时间:2014-08-06 12:27:50

标签: java

首先,我在Java 8工作。

我有一个异步任务,可以生成这个对象:

class Result {

    private AtomicBoolean isComplete = new AtomicBoolean(false)
    private Queue<String> state = new ConcurrentLinkedQueue<>();

    public Queue<String> getState() {
        return state;
    }

    public void setComplete() {
        isComplete.set(true);
        notifyAll();
    }

    public void waitUntilComplete() {
        if (isComplete.get()) {
            return;
        }

        wait();
    }
}

我希望可以选择阻止,直到任务完成。我在考虑使用.wait().notifyAll()

我无法使用未来,因为我在任务执行期间访问当前状态。

这是不好的做法:

  • 它是Java的最新版本,因此我可以访问并发锁包。
  • .wait().notifyAll()Object.class上的公开方法。

1 个答案:

答案 0 :(得分:1)

据我所知,如果你正确使用它们,使用waitnotifynotifyAll方法并不是一种坏习惯。看来你没有正确使用它们。显然,你要么不清楚你想要达到什么目标,要么如何实现它(通过使用这些方法)。

我认为你需要这些方面的东西(下面的代码) 此外,似乎您可以使用LOCK代替this(在您的情况下) 因此,您可以制作完整的两种方法synchronized (隐含地表示synchronized)监视器上的this

class Result {

    private boolean isComplete = false;
    private static final Object LOCK = new Object();

    public void setComplete() {
        synchronized(LOCK){
            isComplete = true;
            LOCK.notifyAll();
        }
    }

    public void waitUntilComplete() {
        synchronized(LOCK){        
            while (!isComplete) {
                LOCK.wait();
            }
            // do what you need to do when
            // complete is already equal to true
        }
    }
}