2010-03-29 4 views
1

차단하지 않는 추적 Java 코드를 대체합니까? 가능한 대기 스레드에만 ping을하고 싶습니다. 이미 모니터에있는 가능한 스레드에서 변경하고 싶지 않습니다. LockSupport.getBlocker()차단하지 않고 Java에서 notify()를 호출하려면 어떻게해야합니까?

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

+0

'notify()'가 차단되지 않으면 제목이 오해의 소지가 있습니다. :) – Bombe

+0

나는 그가 동기화를 통해 다른 스레드를 차단한다고 가정합니다. – Robin

+0

알림을 받으려면 차단해야합니다 : P –

답변

1

대신 모니터의 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 
+0

차단 된 모든 스레드를 삭제하려는 경우 sema.getQueuedThreads()가 반환하는 컬렉션의 모든 스레드를 인터럽트하는 것이 좋은 방법입니까? – svlada

0

시도 공원 아니 당신은 할 수 없습니다 않습니다. 이런 식으로 시도하면 "현재 스레드가 아닌 소유자"가됩니다.

0

와/언 파크

synchronized(monitor) { 
    monitor.notify(); 
} 
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

알림의 포인트는 다른 스레드를하도록하는 것입니다 이진 세마포어는 동기화 블록과 같은 사용을 할 수 있습니다 모니터에서 기다리고있는 사람들은 모니터를 기다려야한다는 것을 알고 있습니다. 모니터의 현재 소유자 만 알림을 전송하여 알림 완료를 알릴 수 있습니다.

모니터를 소유하려면 분명히 다른 스레드를 차단하고 있어야합니다. 그것은 결국 모니터의 목적입니다.

관련 문제