等待/通知只能在锁的范围内完成(例如同步方法或同步块)。
wait和都notify应该在同一个对象上同步。
等待线程:
synchronized(lockObject) {
lockObject.wait(); <-- it will wait here until the notify is called.
}
Run Code Online (Sandbox Code Playgroud)
通知线程:
synchronized(lockObject) {
lockObject.notify();
}
Run Code Online (Sandbox Code Playgroud)
lockObject 可以是任何东西。它可能只是一个new Object(),但很多时候它可能是某个集合、代表打印机的逻辑对象……任何东西。
提示:从评论部分来看,您可能需要以下内容:notify仅释放一个等待线程。但实际上可能有多个线程在等待。如果您想释放所有这些,请使用notifyAll.
或者,您可以创建一个类,并使用方法级锁定。
class LockObject {
public synchronized void waitMethod() {
wait();
}
public synchronized void notifyMethod() {
notify();
}
}
Run Code Online (Sandbox Code Playgroud)
同样,两者都必须使用同一个对象来锁定。
LockObject instance = new LockObject();
Run Code Online (Sandbox Code Playgroud)
然后等待线程:
instance.waitMethod();
Run Code Online (Sandbox Code Playgroud)
和通知线程:
instance.notifyMethod();
Run Code Online (Sandbox Code Playgroud)
另外看看concurrencyJDK的包和教程,你会发现更高级的锁定对象。仅举一例,倒计时锁存器功能强大。
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |