如果信号量锁 acquire/tryAcquire 失败,如何让 Java 线程执行不同的任务而不是阻塞?

How can I make a Java thread do a different task rather than block if a semaphore lock acquire/tryAcquire fails?

我一直在学习 java 中的并发性,并且正在研究 java 信号量和 运行 问题。我有多个线程试图获取多个锁之一以访问受信号量保护的关键部分,并希望我所有未能获取锁的线程执行特定任务,然后尝试重新获取锁。每次获取失败时,我都希望线程执行我所做的等待任务,并在完成后重试。重复直到获得。查看 java 信号量 java 的文档 class,所有获取方法似乎都以某种方式进行某种形式的阻塞。我怎样才能完成我想要的?

使用tryAcquire:

while(!done) {
  if(sem.tryAcquire()) {
     // semaphore acquired
     done=true
  } else {
   // Semaphore not acquired, do something else
  }
}

tryAcquire 还有另一种带有超时的变体,如果您想稍等片刻然后继续,可以使用它。