【问题标题】:Java wait()/notify() not working in same object?Java wait()/notify() 不在同一个对象中工作?
【发布时间】:2011-11-15 07:35:40
【问题描述】:

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

  1. while 循环正在运行一些 I/O 代码。它有一个条件部分,如果 volatile 布尔值为真,则执行该部分。然后它进入一个带有 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();
            }
        }
    }
    

    问题是当您调用该方法时,线程没有唤醒。 “等待” println 甚至从不打印。为什么是这样?你能不能在同一个对象中等待/通知。

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

【问题讨论】:

  • 你怎么知道它是同一个对象?相同的对象!= 相同的类。你能把你开始线程的代码贴出来吗?
  • 并且您 100% 确定线程正在 this.wait() 中等待并且没有卡在 ais.read() source.write() 或其他地方,并且您确定 resume()正确对象上的方法实际上被调用了?
  • 如果你没有在等待/通知方面做练习,因为 Java 5 有更好的同步原语来实现你的目标。
  • 只是为了仔细检查,是 'System.out.println("waiting...");'打印出来?
  • 100% 确定线程处于等待状态。是的,“等待...”确实会打印出来。我知道 Java 5 的并发特性,因为我过去经常使用 ExecutorService 线程。但我对锁的工作并不多,而且我现在并没有真正打算弄清楚...

标签: java multithreading


【解决方案1】:

暂停和播放是否被声明为易失性?有可能其中一个线程看不到其他线程对这些全局变量的修改。而且,我们对游戏的价值一无所知。

【讨论】:

  • 是的。玩是无关紧要的,因为我们使用的是 AND 运算符。线程挂在 wait() 上,因此它甚至不再检查条件。
【解决方案2】:

尝试使用notifyAll(),一切都会好的

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多