【发布时间】:2011-11-15 07:35:40
【问题描述】:
基本上,这就是我想要做的:
-
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; } -
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