2017-11-28 4 views
0

Ich versuche, ein Semaphor zu verwenden, um einen Thread für ein paar Sekunden zu sperren, bevor es auf dem Versuch aufgibt, die Sperre zu erwerben, und macht weiter. Das Problem ist, ich denke, der Semaphor sperrt eigentlich nichts. Hier ist, was ich versuche zu tun:Später erwirbt auf Semaphor auf dem gleichen Thread

Semaphore lock = new Semaphore(1) 
lock.acquire(); 

//Wait until some other thread releases the lock, or until the timeout 
lock.tryAcquire(WAIT_INTERVAL, TimeUnit.MILLISECONDS); 

//do whatever 

Ich denke, das Problem ist: Der Versuch, zweimal aus dem gleichen Thread zu erwerben nicht den Faden nicht ausgeführt werden, wenn es bereits das Schloss erworben hat. Aber ich bin mir nicht sicher. Ist das was passiert?

Danke Jungs. im Code

+0

Kann nicht reproduziert werden. Seltsame Möglichkeit, deinen eigenen Thread zu blockieren. Suchst du nach 'Thread.sleep()'? – EJP

Antwort

0

Erklärung dessen, was

  1. lock.acquire(); Erwirbt eine Genehmigung dieser Semaphore geschieht, blockiert, bis eine verfügbar ist. Da Sie nur versuchen zu erwerben und 1 Erlaubnis verfügbar, dann wird es sofort erwerben.

  2. lock.tryAcquire(WAIT_INTERVAL, TimeUnit.MILLISECONDS); seit 1 erlaubnis bereits erworben (aus der vorherigen zeile des codes), wird dies niemals sperren, bis jemand die sperre loslassen. Es wird also warten/blockieren bis Timeout ich meine WAIT_INTERVAL Zeit verstreicht. Und diese Methode gibt einen boolean Wert true zurück, wenn eine Genehmigung erworben wurde, und false, wenn die Wartezeit vor dem Erwerb einer Genehmigung verstrichen ist. So wird es offensichtlich false zurückgeben.

Verwandte Themen