2015-11-06 60 views
0

想到解決方案後,我不知道爲什麼這個代碼無法正常工作。爲什麼notifyAll()不起作用?

如果我執行mediaPlayer.start(),線程進入環路和wait(),但後來,當mediaPlayer來電OnCompletionListenernotifyAll()不會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()),爲什麼?

+0

看起來像一個經典的「丟失的通知」:http://stackoverflow.com/questions/5999100/is-there-a-block-until-condition-becomes-true-function-in-java/26218153#26218153 –

回答

0

您不通知您正在等待的同一個對象。您正在通知偵聽器對象,該對象是實現偵聽器接口的匿名類的實例。您需要將notifyAll()限定爲XXX.this.notifyAll(),其中XXX與包含set()reproductor()方法的類相同。