Java wait()/notify()在同一对象中不工作?
基本上,这就是我要做的:Java wait()/notify()在同一对象中不工作?,java,multithreading,Java,Multithreading,基本上,这就是我要做的: while循环正在运行一些I/O代码。它有一个条件部分,如果volatile boolean为true,则执行该部分。然后,它进入一个带有while循环的同步块。标准做法。它调用'this.wait()'并等待通知 while((len=ais.read(buff))>=0) { source.write(buff, 0, len); if(paused) {
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;
}
public void resume() {
synchronized(this) {
if(paused) {
paused = false;
this.notify();
}
}
}
问题是当您调用该方法时,线程没有被唤醒。“等不及了”的照片根本就没印过。为什么会这样?不能在同一对象内执行等待/通知解决了!完全忘记了代码的第一部分(等待部分)在嵌套类中,因此不是同一个对象。当我注意到它们的散列码不一样时,我意识到了这一点。只要尝试使用
notifyAll()
,一切都应该正常。是否暂停播放并声明为不稳定?其中一个线程可能看不到另一个线程对这些全局变量的修改。而且,我们对玩的价值一无所知。你怎么知道它是同一个物体?相同的对象!=同一班。你能在开始线程的地方发布代码吗?你100%确定线程正在这个.wait()中等待,没有卡在ais.read()source.write()或其他地方,并且你确定正确对象上的resume()方法确实被调用了吗?如果你没有在wait/notify上做练习,自Java5以来,有更好的同步原语来实现您的目标。请仔细检查一下,“System.out.println(“waiting…””);”打印出来?100%确定螺纹卡在等待中。是的,“等待…”会打印出来。我知道Java5的并发特性,因为我在过去经常使用ExecutorService线程。但是我对锁没有做太多的研究,而且我现在也不打算尝试去弄清楚它……是的,它们是。播放是不相关的,因为我们使用AND运算符。线程挂起在wait()上,因此它甚至不再检查条件。