簡體   English   中英

在這種情況下使用.wait()和.notifyAll是否是錯誤的做法

[英]Is it bad practice to use .wait() and .notifyAll in this circumstance

首先,我正在使用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()

我無法使用Future,因為我在任務執行期間確實訪問了當前狀態。

鑒於以下情況,這是不好的做法嗎?

  • 它是Java的最新版本,因此我可以訪問並發鎖包。
  • .wait().notifyAll()Object.class上的公共方法。

據我所知,如果正確使用了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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM