繁体   English   中英

如何在不阻塞的情况下在Java中调用notify()?

[英]How can I call notify() in Java without blocking?

是否有替代不会阻止的Java代码? 我只想ping一个可能的等待线程。 我不希望在显示器中已有的可能线程上进行任何更改。

synchronized( monitor ) {
    monitor.notify();
}

通知的目的是让在监视器上等待的其他线程知道他们可以尝试获取它。 只有监视器的当前所有者才能发送通知以指示它们已完成。

拥有显示器,你显然阻止任何其他线程。 毕竟这就是显示器的目的。

也许ReentrantLock可以解决您的问题? 例如

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

另外,你可以做类似的事情

lock.isLocked()

lock.tryLock()

您可以使用java.util.concurrent.Semaphore而不是monitor。 二进制信号量可以与同步块具有相同的用途:

private final Semaphore sema = new Semaphore(1, true); // binary: only 1 permit
....
try {
    sema.acquire();   // blocks till permit is available
    try {
        // critical section code
        ....
    } finally {
        sema.release();   // release permit
    }
} catch (InterruptedException ie) {
    ....

您可以使用以下方法检查信号量的状态:

sema.availablePermits()  // 1 if no threads in critical section
sema.getQueueLength()    // number of threads blocked waiting on acquire
sema.getQueuedThreads()  // list of threads blocked waiting on acquire

尝试使用LockSupport.getBlocker()停放/ LockSupport.getBlocker()

http://java.sun.com/javase/6/docs/api/java/util/concurrent/locks/LockSupport.html

你不能。 如果您尝试这样的话,您将获得“当前线程不是所有者”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM