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