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

时间:2010-03-29 14:18:48

标签: java multithreading

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

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

也许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()

答案 2 :(得分:1)

您可以使用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

答案 3 :(得分:0)

尝试使用LockSupport.getBlocker()

停放/取消停放

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

答案 4 :(得分:0)

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