在java中使用Object作为互斥体

Mar*_*sen 8 java multithreading mutex notify wait

你好有好人,我需要一些帮助.

我正在写一个音乐播放器,它可以播放来自网络的音乐.如果我在音乐完成缓冲之前按下播放按钮,我希望它等待.

我尝试过这样的事情:

Object mutex = new Object();

public void main() {
    startStreaming();
    mutex.notify();
}

private void onClickPlayButton() {
    mutex.wait();
}
Run Code Online (Sandbox Code Playgroud)

问题是,mutex.notify()如果没有按下playButton,则抛出一个" llegalMonitorStateException".你通常如何解决这样的问题?

编辑要说清楚.我的问题是:如何使按钮等待"startStreamning"方法完成?

sgo*_*les 11

根据JavaDoc,

抛出IllegalMonitorStateException "表示线程已尝试在对象的监视器上等待或通知在对象的监视器上等待的其他线程,而不拥有指定的监视器."

为了调用mutex.wait()or mutex.notify(),调用线程必须拥有对象互斥锁的锁.

如果在没有前面的情况下调用它,则抛出此异常 synchronized (mutex) { }

检查出的漂亮的动画wait,并notify在此链接:如何等待和通知真的有用吗?


Erh*_*mir 5

对于wait(),notify()调用,您需要一个同步代码.试试这个:

synchronized (this) {
  try {
    this.wait();
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
}


synchronized (this) {
   notify();
}
Run Code Online (Sandbox Code Playgroud)