Java wait()/notify()在同一对象中不起作用



基本上,这就是我要做的:

  1. 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;
            }
    
  2. 相同对象中的其他方法将布尔值'paused'更改为false。然后该方法调用'this.notify'

    public void resume() {
        synchronized(this) {
            if(paused) {
                paused = false;
                this.notify();
            }
        }
    }
    

    问题是当你调用这个方法时,线程没有被唤醒。"等待已久"的印刷品甚至都不会打印出来。为什么会这样?

解决!完全忘记了代码的第一部分(等待部分)是在嵌套类中,因此不是同一个对象。当我注意到它们的哈希码不一样时,我意识到了这一点。

暂停和播放声明为volatile?有可能其中一个线程没有看到另一个线程对这些全局变量的修改。而且,我们也不知道玩的价值。

尝试使用notifyAll(),一切都应该ok

最新更新