8

你好,好人,我需要一些帮助。

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

我试着做这样的事情:

Object mutex = new Object();

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

private void onClickPlayButton() {
    mutex.wait();
}

mutex.notify()问题是如果抛出“ ” ,则未按下播放按钮llegalMonitorStateException。您通常如何解决此类问题?

编辑说清楚。我的问题是:如何让按钮等待“startStreamning”方法完成?

4

7 回答 7

11

根据JavaDoc,

IllegalMonitorStateException被抛出“表明一个线程试图在一个对象的监视器上等待,或者通知其他线程在一个对象的监视器上等待而不拥有指定的监视器。”

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

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

在这个链接中查看wait和的漂亮动画:等待和通知如何真正起作用?notify

于 2011-05-19T18:43:02.637 回答
5

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

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


synchronized (this) {
   notify();
}
于 2011-05-19T18:47:10.703 回答
4

尝试使用初始许可为 0 的信号量。信号量互斥量 = 新信号量(0);

主要是mutex.release();

在点击mutex.acquire();

于 2011-05-19T18:52:32.640 回答
2

来自 javadoc wait 此方法只能由该对象的监视器所有者的线程调用, 而对于notify 该方法只能由该对象的监视器所有者的线程调用。

这意味着您必须在使用通知和等待时使用互斥锁进行同步

于 2011-05-19T18:44:55.277 回答
0

你必须wait在你面前notify

于 2011-05-19T18:43:52.420 回答
0

您必须在互斥锁上同步才能调用通知并等待

于 2011-05-19T18:47:33.730 回答
0

您可以查看使用更复杂的锁对象,也可以简单地在 try/catch 块中咀嚼异常。后者绝对是“又快又脏”。

有关更高级的锁定对象,请查看http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

于 2011-05-19T18:47:42.627 回答