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

如果信号量锁获取/tryAcquire失败,如何让Java线程执行不同的任务而不是阻塞?,java,multithreading,concurrency,semaphore,critical-section,Java,Multithreading,Concurrency,Semaphore,Critical Section,我一直在学习java中的并发性,在研究java信号量时遇到了一个问题。我有多个线程试图获取多个锁中的一个,以访问受信号量保护的关键部分,并希望所有未能获取锁的线程执行特定任务,然后尝试重新获取锁。每次采集失败时,我都希望线程执行我所做的等待任务,完成后再试一次。重复,直到获得。查看java信号量类的java文档,所有acquire方法似乎都以某种方式执行某种形式的阻塞。如何实现我的目标?使用tryAcquire: tryAcquire还有另一种带有超时的变体,如果您想等待一段时间然后继续,可以使

我一直在学习java中的并发性,在研究java信号量时遇到了一个问题。我有多个线程试图获取多个锁中的一个,以访问受信号量保护的关键部分,并希望所有未能获取锁的线程执行特定任务,然后尝试重新获取锁。每次采集失败时,我都希望线程执行我所做的等待任务,完成后再试一次。重复,直到获得。查看java信号量类的java文档,所有acquire方法似乎都以某种方式执行某种形式的阻塞。如何实现我的目标?

使用tryAcquire:

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

使用tryAcquire:


tryAcquire的另一个变体有一个超时,如果您想等待一段时间然后继续,可以使用它。

这确实解决了我想要的部分问题,因此非常感谢您。但它并没有解决我的问题,我还需要它在“else”部分无限期完成后重试采集,直到被采集。将其放入while循环,如更新的答案所示。非常感谢!不要加卷发。就一会儿!sem.tryAcquire{/*做点别的*/}这确实解决了我想要的部分问题,所以非常感谢。但它并没有解决我的问题,我还需要它在“else”部分无限期完成后重试采集,直到被采集。将其放入while循环,如更新的答案所示。非常感谢!不要加卷发。就一会儿!sem.tryAcquire{/*做点别的*/}
while(!done) {
  if(sem.tryAcquire()) {
     // semaphore acquired
     done=true
  } else {
   // Semaphore not acquired, do something else
  }
}