如何在Java中调用notify()而不阻塞?

如何在Java中调用notify()而不阻塞?,java,multithreading,Java,Multithreading,下面的Java代码是否有一个不会阻塞的替代品?我只需要ping一个可能的等待线程。我不希望对监视器中已经存在的可能线程进行任何更改 synchronized( monitor ) { monitor.notify(); } 使用LockSupport.getBlocker()尝试驻车/解锁 尝试使用LockSupport.getBlocker()驻车/解锁 不,你不能。如果您尝试这样的操作,您将得到一个“当前线程不是所有者”。不,您不能。如果您尝试这样的操作,您将得到一个“当前线程不是

下面的Java代码是否有一个不会阻塞的替代品?我只需要ping一个可能的等待线程。我不希望对监视器中已经存在的可能线程进行任何更改

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

使用
LockSupport.getBlocker()尝试驻车/解锁


尝试使用
LockSupport.getBlocker()驻车/解锁


不,你不能。如果您尝试这样的操作,您将得到一个“当前线程不是所有者”。

不,您不能。如果您尝试这样的操作,您将得到一个“当前线程不是所有者”。

也许可以解决您的问题?比如说

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

也许一个解决你问题的方法?比如说

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


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

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

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


为了拥有监视器,您显然正在阻止任何其他线程。这毕竟是监视器的目的。

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


为了拥有监视器,您显然正在阻止任何其他线程。毕竟,这就是监视器的用途。

notify()
永远不要阻止,你的标题有误导性。:)我想他是指通过synchronized阻止其他线程。您确实需要阻止才能通知:P
notify()
never blocks,您的标题有误导性。:)我想他指的是通过synchronized阻止其他线程。您确实需要阻止才能通知:如果我们想放弃所有被阻止的线程,那么中断sema.getQueuedThreads()返回的集合中的所有线程是否是一种好方法?如果我们想放弃所有被阻止的线程,中断sema.getQueuedThreads()返回的集合中的所有线程是一种好方法吗?