8

こんにちは、良い人たちです。助けが必要です。

Web から音楽をストリーミングする音楽プレーヤーを作成しています。音楽のバッファリングが完了する前に再生ボタンを押すと、待機させます。

私はこのようなことをしてみました:

Object mutex = new Object();

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

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

問題は、playButton が押されていないmutex.notify()場合に " " がスローされることですllegalMonitorStateException。このような問題を通常どのように解決しますか?

編集明確にするために。私の質問は、「startStreamning」メソッドが終了するまでボタンを待機させるにはどうすればよいですか?

4

7 に答える 7

11

JavaDocによると、

IllegalMonitorStateExceptionは、「スレッドがオブジェクトのモニターで待機しようとしたことを示すため、または指定されたモニターを所有せずにオブジェクトのモニターで待機している他のスレッドに通知するために」スローされます。

mutex.wait()またはを呼び出すmutex.notify()には、呼び出しスレッドがオブジェクト ミューテックスのロックを所有している必要があります。

この例外は、前置なしで呼び出すとスローされますsynchronized (mutex) { }

このリンクのwaitとの素敵なアニメーションをチェックしてください: How do wait and notify really work?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

from javadoc wait このメソッドは、このオブジェクトのモニターの所有者であるスレッドによってのみ呼び出され、通知 の ために呼び出される必要があります。このメソッドは、このオブジェクトのモニターの所有者であるスレッドによってのみ呼び出される必要があります。

これは、通知と待機を使用するときにミューテックスを使用して同期する必要があることを意味します

于 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 に答える