基本上,这就是我要做的:
-
while循环正在运行一些I/O代码。如果易失性布尔值为真,它有一个条件段执行。然后,它进入一个带有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; }
-
相同对象中的其他方法将布尔值'paused'更改为false。然后该方法调用'this.notify'
public void resume() { synchronized(this) { if(paused) { paused = false; this.notify(); } } }
问题是当你调用这个方法时,线程没有被唤醒。"等待已久"的印刷品甚至都不会打印出来。为什么会这样?
解决!完全忘记了代码的第一部分(等待部分)是在嵌套类中,因此不是同一个对象。当我注意到它们的哈希码不一样时,我意识到了这一点。
暂停和播放声明为volatile?有可能其中一个线程没有看到另一个线程对这些全局变量的修改。而且,我们也不知道玩的价值。
尝试使用notifyAll()
,一切都应该ok