Java wait()/ notify()不能在同一个对象中工作?

时间:2011-11-14 22:21:12

标签: java multithreading

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

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

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

    问题是当你调用那个方法时,线程没有被唤醒。 “失去了等待”的印刷品甚至从未印刷过。为什么是这样?你能不能在同一个对象中等待/通知。

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

2 个答案:

答案 0 :(得分:1)

暂停并播放声明为易变?其中一个线程可能没有看到另一个线程对这些全局变量的修改。另外,我们对游戏的价值一无所知。

答案 1 :(得分:0)

尝试使用notifyAll(),一切都应该没问题