我试图弄清楚我们如何才能正确地等待直到另一个线程中的锁被释放。

我认为代码可以更好地解释我的意思:

myLock.lock();
sendSomewhereMyLock(myLock); //creates new threads inside
myLock.waitUntilReleasedByAnotherThread(60L, TimeUnit.SECONDS);
//do something after the lock is released

我以为tryLock(long time, TimeUnit unit)是我需要的方法,但是Java文档说该方法将立即执行,因为该锁是由当前线程获取的:



那我该怎么用呢?

最佳答案

我认为您正在寻找的是 Condition

有了它,您可以定义一个类似于workCompleted的条件,并进行初始线程检查并等待该条件。

final Condition workCompleted = myLock.newCondition();
//...
myLock.lock();
try {
  final OtherThread otherThread = startOtherThread(myLock, workCompleted);
  while (otherThread.completed() == false) {
    workCompleted.await();
  }
} finally {
  myLock.unlock();
}

// other thread
doTheWork();
this.completed = true;
theLock.lock();
try {
  workCompleted.signal();
} finally {
  theLock.unlock();
}

concurrent package中预先设置了许多这样的条件,其中一些条件可能比上面的简单示例更好地满足您的要求。

10-02 03:29