[英]Why notifyAll() doesn't work?
在考慮解決方案之后,我不知道為什么這段代碼無法正常工作。
如果我執行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()
),為什么?
您沒有通知正在等待的對象。 您要通知偵聽器對象,該對象是實現偵聽器接口的匿名類的實例。 您需要將notifyAll()
限定為XXX.this.notifyAll()
,其中XXX
與包含set()
和reproductor()
方法的類相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.