Java 在一个线程完成之前阻止其他线程的最佳方法
我有许多线程监视特定的状态。如果应用程序进入那种状态,那么我需要做一些额外的工作。我希望只允许一个线程执行该任务,并希望阻止其他线程,直到该任务完成。阻塞意味着他们不能再次执行该任务 我有以下情况:Java 在一个线程完成之前阻止其他线程的最佳方法,java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,我有许多线程监视特定的状态。如果应用程序进入那种状态,那么我需要做一些额外的工作。我希望只允许一个线程执行该任务,并希望阻止其他线程,直到该任务完成。阻塞意味着他们不能再次执行该任务 我有以下情况: ReentrantLock lock = new ReentrantLock void doSomething() { if (lock.tryLock()) { try { doSomeWork() } finally
ReentrantLock lock = new ReentrantLock
void doSomething() {
if (lock.tryLock()) {
try {
doSomeWork()
} finally {
lock.unLock()
}
} else {
// wait for DoSomeWork is done
}
}
我可以在一个循环中监视lock.isLocked(),但实际上我只想等待另一个线程完成工作。根据有关类的文档: 建议的做法是始终立即拨打电话 使用try块锁定,最典型的是在构建之前/之后锁定 例如:
从方法的文档中可以看到:“如果锁由另一个线程持有,那么当前线程出于线程调度目的将被禁用,并处于休眠状态,直到获得锁为止”,这是您希望在场景中得到保证的 你的问题到底是什么?您可以使用
lock.lock()
,它将等待锁被释放,并保证在给定的时间内只有一个线程拥有它,这不是您想要的吗?啊,是的,不知怎么的,我把它复杂化了。让尝试{lock.lock()}最后{lock.unlock()}
将解决问题
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}