Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么notifyAll()不起作用?_Java_Android_Multithreading - Fatal编程技术网

Java 为什么notifyAll()不起作用?

Java 为什么notifyAll()不起作用?,java,android,multithreading,Java,Android,Multithreading,在考虑了一个解决方案之后,我不知道为什么这个代码不能正常工作 如果我执行mediaPlayer.start,线程进入循环并等待,但是当mediaPlayer调用OnCompletionListener时,notifyAll不会从等待中唤醒,并且循环永远处于等待状态 假设“音乐线程”在类的开头正确启动,MediaPlayer对象也是如此 另一方面,如果我在循环中使用相反的语句,它会正常工作!mediaPlayer.isplay,为什么?您没有通知正在等待的同一对象。您正在通知侦听器对象,该对象是实

在考虑了一个解决方案之后,我不知道为什么这个代码不能正常工作

如果我执行mediaPlayer.start,线程进入循环并等待,但是当mediaPlayer调用OnCompletionListener时,notifyAll不会从等待中唤醒,并且循环永远处于等待状态

假设“音乐线程”在类的开头正确启动,MediaPlayer对象也是如此


另一方面,如果我在循环中使用相反的语句,它会正常工作!mediaPlayer.isplay,为什么?

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

看起来像一个经典的丢失通知:
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();
        }
    }
}