использование объекта в качестве мьютекса в java

Привет, хороший poeple, мне нужна помощь.

Я пишу музыкальный плеер, который транслирует музыку из интернета. Если я нажму кнопку воспроизведения до завершения буферизации музыки, я хочу, чтобы она подождала.

Я пытался сделать что-то вроде этого:

Object mutex = new Object();

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

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

проблема в том, что кнопка воспроизведения не нажата mutex.notify() если бросает "llegalMonitorStateException". Как вы обычно решаете такие проблемы?

редактировать чтобы сделать ясным. Мой вопрос: Как заставить кнопку ждать завершения метода "startStreamning"?

7 ответов


согласно JavaDoc,

IllegalMonitorStateException бросается - чтобы показать, что нить имеет попытка ожидания объекта мониторинг или уведомление других потоков ожидание на мониторе объекта без владение указанным монитором."

для того, чтобы позвонить mutex.wait() или mutex.notify(), вызывающий поток должен владеть блокировкой мьютекса объекта.

это исключение вызывается, если вы вызываете его без предшествующего synchronized (mutex) { }

Проверьте хорошую анимацию wait и notify в этой ссылке : как ждать и уведомлять действительно работать?


для вызова wait (), notify () вам нужен синхронизированный код. попробуйте это:

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


synchronized (this) {
   notify();
}

попробуйте использовать семафор С 0 первоначальным разрешением. Semaphore mutex = новый семафор (0);

в основном mutex.release();

in on click mutex.acquire();


из javadoc ждать этот метод должен вызываться только потоком, который является владельцем монитора этого объекта и за уведомления этот метод должен вызываться только потоком, который является владельцем монитора этого объекта.

Это означает, что вы должны синхронизировать с помощью мьютекса при использовании notify и wait


вы должны wait перед notify.


вы должны синхронизировать на мьютексе, чтобы позвонить уведомить и ждать


вы можете либо смотреть на использование более сложных объектов блокировки, либо просто жевать исключение в блоке try/catch. Последнее определенно "быстрое и грязное".

на дополнительные объекты замок, взгляните на http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html