如何在Java中调用notify()而不阻塞?
下面的Java代码是否有一个不会阻塞的替代品?我只需要ping一个可能的等待线程。我不希望对监视器中已经存在的可能线程进行任何更改如何在Java中调用notify()而不阻塞?,java,multithreading,Java,Multithreading,下面的Java代码是否有一个不会阻塞的替代品?我只需要ping一个可能的等待线程。我不希望对监视器中已经存在的可能线程进行任何更改 synchronized( monitor ) { monitor.notify(); } 使用LockSupport.getBlocker()尝试驻车/解锁 尝试使用LockSupport.getBlocker()驻车/解锁 不,你不能。如果您尝试这样的操作,您将得到一个“当前线程不是所有者”。不,您不能。如果您尝试这样的操作,您将得到一个“当前线程不是
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阻止其他线程。您确实需要阻止才能通知:Pnotify()
never blocks,您的标题有误导性。:)我想他指的是通过synchronized阻止其他线程。您确实需要阻止才能通知:如果我们想放弃所有被阻止的线程,那么中断sema.getQueuedThreads()返回的集合中的所有线程是否是一种好方法?如果我们想放弃所有被阻止的线程,中断sema.getQueuedThreads()返回的集合中的所有线程是一种好方法吗?