0
想到解決方案後,我不知道爲什麼這個代碼無法正常工作。爲什麼notifyAll()不起作用?
如果我執行mediaPlayer.start()
,線程進入環路和wait()
,但後來,當mediaPlayer
來電OnCompletionListener
,notifyAll()
不會wait()
喚醒和循環在wait()
狀態永遠...
(假設'音樂主題」是在課程開始正常啓動,並與MediaPlayer
對象相同)
private synchronized void set()
{
while(mediaPlayer.isPlaying())
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//DO SOMETHING (THE PROBLEM IS THAT NEVER REACHES THIS CODE)
}
private synchronized void reproductor()
{
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public synchronized void onCompletion(MediaPlayer mediaPlayer) {
notifyAll(); //because mediaPlayer.isPlaying() changes
}
});
}
private class Music implements Runnable
{
@Override
public void run() {
try {
reproductor();
while(true) {
set();
Thread.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在另一方面,如果我在循環使用相反的聲明能夠正常工作(!mediaPlayer.isPlaying()
),爲什麼?
看起來像一個經典的「丟失的通知」:http://stackoverflow.com/questions/5999100/is-there-a-block-until-condition-becomes-true-function-in-java/26218153#26218153 –