基本上,这就是我想要做的事情:
while循环正在运行一些I / O代码。它有一个条件部分,如果volatile布尔值为true则执行。然后它进入带有while循环的同步块。标准做法。它调用'this.wait()'并等待通知。
while((len=ais.read(buff))>=0) {
source.write(buff, 0, len);
if(paused) {
synchronized(this) {
while(paused && playing) {
try {
System.out.println("waiting...");
this.wait();
System.out.println("out of wait");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
if(!playing) break;
}
SAME对象中的其他方法将布尔值“暂停”更改为false。然后该方法调用'this.notify'
public void resume() {
synchronized(this) {
if(paused) {
paused = false;
this.notify();
}
}
}
问题是当你调用那个方法时,线程没有被唤醒。 “失去了等待”的印刷品甚至从未印刷过。为什么是这样?你能不能在同一个对象中等待/通知。
解决!完全忘记了代码的第一部分(等待部分)是在嵌套类中,因此不是同一个对象。当我注意到他们的哈希码不相同时,我开始意识到这一点。
答案 0 :(得分:1)
暂停并播放声明为易变?其中一个线程可能没有看到另一个线程对这些全局变量的修改。另外,我们对游戏的价值一无所知。
答案 1 :(得分:0)
尝试使用notifyAll()
,一切都应该没问题