如何在不释放锁的情况下使线程等待? 如果这不可能,那么在某个条件不满足时我如何暂停线程,并在条件满足时或在通知它时将其取消暂停
答案 0 :(得分:0)
等待/通知只能在锁的范围内完成(例如,同步方法或同步块)。
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很强大。