如何在不释放锁的情况下让线程等待? 如果这不可能,那么我如何在不满足特定条件时暂停线程,并在满足条件或通知它时立即取消暂停
最佳答案
等待/通知的概念
等待/通知只能在锁的范围内完成(例如同步方法或同步块(synchronized block))。
wait
和 notify
应该在同一个对象上同步。
等待线程:
synchronized(lockObject) {
lockObject.wait(); <-- it will wait here until the notify is called.
}
通知线程:
synchronized(lockObject) {
lockObject.notify();
}
lockObject 可以是任何东西。它可能只是一个 new Object()
,但通常它可能是某个集合、一个代表打印机的逻辑对象……任何东西。
提示:从评论部分来看,您可能需要以下内容:notify
仅释放一个等待线程。但是您实际上可能有多个线程在等待。如果要释放所有这些,请使用 notifyAll
。
同样的事情,但使用同步方法
或者,您可以创建一个类,并使用方法级锁定。
class LockObject {
public synchronized void waitMethod() {
wait();
}
public synchronized void notifyMethod() {
notify();
}
}
同样,两者都必须使用相同的对象来锁定。
LockObject instance = new LockObject();
然后是等待线程:
instance.waitMethod();
通知线程:
instance.notifyMethod();
如果你是认真的
同时看看 concurrency
packages and tutorials of the JDK ,你会发现更高级的锁定对象。仅举一个例子,countdown latches很强大。
关于Java等待没有锁释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55354914/