簡體   English   中英

為什么notifyAll()不起作用?

[英]Why notifyAll() doesn't work?

在考慮解決方案之后,我不知道為什么這段代碼無法正常工作。

如果我執行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() ),為什么?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM