为什么notifyAll()不起作用?

时间:2015-11-06 23:17:20

标签: java android multithreading

在考虑解决方案之后,我不知道为什么这段代码无法正常运行。

如果我执行mediaPlayer.start(),则线程会循环进入wait(),但是当mediaPlayer调用OnCompletionListener时,notifyAll()不会从wait()唤醒,并永远在wait()状态循环......

(假设' Music Thread'在课程开始时正确启动,与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()),为什么?

1 个答案:

答案 0 :(得分:0)

您没有通知您正在等待的同一个对象。您正在通知侦听器对象,该对象是实现侦听器接口的匿名类的实例。您需要将notifyAll()限定为XXX.this.notifyAll(),其中XXX与包含set()reproductor()方法的类相同。