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循环正在运行一些I/O代码。它有一个条件部分,如果volatile boolean为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;
            }
    
  • 同一对象中的其他方法将布尔值“暂停”更改为false。然后该方法调用“this.notify”

    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()上,因此它甚至不再检查条件。