차단하지 않는 추적 Java 코드를 대체합니까? 가능한 대기 스레드에만 ping을하고 싶습니다. 이미 모니터에있는 가능한 스레드에서 변경하고 싶지 않습니다. LockSupport.getBlocker()
차단하지 않고 Java에서 notify()를 호출하려면 어떻게해야합니까?
http://java.sun.com/javase/6/docs/api/java/util/concurrent/locks/LockSupport.html
차단하지 않는 추적 Java 코드를 대체합니까? 가능한 대기 스레드에만 ping을하고 싶습니다. 이미 모니터에있는 가능한 스레드에서 변경하고 싶지 않습니다. LockSupport.getBlocker()
차단하지 않고 Java에서 notify()를 호출하려면 어떻게해야합니까?
http://java.sun.com/javase/6/docs/api/java/util/concurrent/locks/LockSupport.html
대신 모니터의 java.util.concurrent.Semaphore를 사용할 수처럼 물건을 할 수 있습니다. 다음과 같은 방법으로 세마포어의 상태를 확인할 수 있습니다
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
차단 된 모든 스레드를 삭제하려는 경우 sema.getQueuedThreads()가 반환하는 컬렉션의 모든 스레드를 인터럽트하는 것이 좋은 방법입니까? – svlada
시도 공원 아니 당신은 할 수 없습니다 않습니다. 이런 식으로 시도하면 "현재 스레드가 아닌 소유자"가됩니다.
와/언 파크
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()
알림의 포인트는 다른 스레드를하도록하는 것입니다 이진 세마포어는 동기화 블록과 같은 사용을 할 수 있습니다 모니터에서 기다리고있는 사람들은 모니터를 기다려야한다는 것을 알고 있습니다. 모니터의 현재 소유자 만 알림을 전송하여 알림 완료를 알릴 수 있습니다.
모니터를 소유하려면 분명히 다른 스레드를 차단하고 있어야합니다. 그것은 결국 모니터의 목적입니다.
'notify()'가 차단되지 않으면 제목이 오해의 소지가 있습니다. :) – Bombe
나는 그가 동기화를 통해 다른 스레드를 차단한다고 가정합니다. – Robin
알림을 받으려면 차단해야합니다 : P –