2014-05-04 12 views
6

Jestem nowy w Java concurrency/multi-threading. Czy ktoś może mi wyjaśnić, w jakich sytuacjach nabywać() i nabywaćNieprzerwanie() musi (lub nie musi) być używane, jak są różne; a także jak z nich korzystać (przykład kodu?).Kiedy używać metody acquire() i acquireUninterruptibly() java.util.concurrent.Semaphore?

Dziękuję bardzo.

+1

acquire() jest przerywalna (zakładam, że wiesz, co oznacza), a druga nie. Jeśli nie chcesz przerwać, aby zatrzymać nabywanie() używać później, jeśli kod może obsługiwać przerwań, użyj tego pierwszego. –

+0

Peter, Powiedziałeś "... Jeśli nie chcesz przerwać, aby zatrzymać nabycie() użyj później ..". Czy nabyta semafora będzie przydatna, gdy wątek zostanie przerwany? – appFormation

+0

Semafor jest przydatny w obu przypadkach. Przerwanie zmienia tylko ścieżkę, którą przyjmuje kod. –

Odpowiedz

0

Zgodnie z dokumentacją:

Obie metody uzyskuje zezwolenie od Semaphore i blokowanie dopóki jeden jest dostępny. Ale metoda acquire() zostaje przerwana, co oznacza, że ​​blokuje się, dopóki wątek nie zostanie przerwany i zgłasza wyjątek przerwany (który jest zaznaczony).

Ale acquireUninterruptibly() nie działa, gdy wątek zostanie przerwany, utrzymuje stan bloku, aż uzyska zezwolenie z semafora.

Źródło: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquireUninterruptibly()

1

acquire() jest przerywana. Oznacza to, że jeśli wątek tematyce dzwoni acquire() na semafora, a wątek B przerywa podaje na wywołując interrupt(), wówczas InterruptedException zostanie wyrzucony na wątku A.

Z drugiej strony nie jest przerywana acquireUninterruptibly(). Oznacza to, że jeśli wątek A wywołuje acquireUninterruptibly() na semaforze, a wątek B przerywa gwinty A przez wywołanie interrupt(), to nie zostanie zgłoszony żaden wątek A w wątku A, tylko ten wątek A będzie miał ustawiony status przerwania po powrocie acquireUninterruptibly().

Powiązane problemy