использование объекта в качестве мьютекса в 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
вы можете либо смотреть на использование более сложных объектов блокировки, либо просто жевать исключение в блоке try/catch. Последнее определенно "быстрое и грязное".
на дополнительные объекты замок, взгляните на http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html