2014-05-04 6 views
6

Ich bin neu in Java Concurrency/Multithreading. Kann mir bitte jemand erklären, in welchen Situationen die acquire() und acquireUnterbrechbar() verwendet werden müssen (oder dürfen), wie sie sich unterscheiden; und auch wie man sie benutzt (Codebeispiel?).Wann die acquire() - und acquireUninterruptibly() -Methode von java.util.concurrent.Semaphore verwendet werden soll?

Vielen Dank.

+1

acquire() ist unterbrechbar (ich nehme an, Sie wissen, was es bedeutet) und das andere ist nicht. Wenn Sie nicht möchten, dass ein Interrupt die Methode acquire() stoppt, verwenden Sie die erstere Funktion, wenn Sie Code verarbeiten können. –

+0

Peter, Du hast gesagt "... Wenn du keinen Interrupt haben willst, den acquire() zu stoppen, benutze den späteren ...". Wird also das erworbene Semaphor nützlich sein, wenn der Thread selbst unterbrochen wurde? – appFormation

+0

Der Semaphor ist in beiden Fällen nützlich. Der Interrupt ändert nur den Pfad des Codes. –

Antwort

0

Per Dokumentation:

Beide Methoden erwirbt Genehmigung von Semaphore und bis eine Blockierung zur Verfügung steht. Aber acquires() Methode wird unterbrochen, das bedeutet, dass es blockiert, bis der Thread interrupted wird und es Interrupted Exception auslöst (was einer überprüft wird).

Aber acquireUnterruptibly() hat keine Wirkung, wenn der Thread unterbrochen wird, er behält den Blockstatus bei, bis er die Erlaubnis vom Semaphor erhält.

Quelle: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquireUninterruptibly()

1

acquire() ist unterbrechbare. Das heißt, wenn ein Thread A acquire() auf einem Semaphor-Aufruf und Faden B unterbricht Fäden A durch interrupt() Aufruf, dann wird eine auf dem Gewinde InterruptedException A.

acquireUninterruptibly() Auf der anderen Seite geworfen wird, nicht unterbrechbare. Das heißt, wenn ein Thread A auf einem Semaphor acquireUninterruptibly() aufruft und Thread B Threads A unterbricht, indem interrupt() aufruft, dann wird InterruptedException auf Thread A ausgelöst, nur Thread A wird seinen unterbrochenen Status festgelegt, nachdem acquireUninterruptibly() zurückgibt.

Verwandte Themen