2014-05-04 8 views
6

Sono nuovo alla concorrenza Java/multi-threading. Qualcuno può spiegarmi in quali situazioni l'acquisizione() e l'acquisizione() devono (o non devono) essere utilizzate, come sono diverse; e anche come usarli (codice di esempio?).Quando utilizzare il metodo java.util.concurrent.Semaphore acquisisci() e acquisisciUninterruptibly()?

Grazie mille.

+1

acquire() è interrompibile (presumo tu sappia cosa significa) e l'altro no. Se non vuoi che un interrupt interrompa l'acquisizione() usa il successivo, se il codice è in grado di gestire gli interrupt, usa il primo. –

+0

Peter, hai detto "... Se non vuoi interrompere l'acquisizione() usa più tardi ..". Quindi, il semaforo acquisito sarà mai utile quando il thread stesso viene interrotto? – appFormation

+0

Il semaforo è utile in entrambi i casi. L'interrupt cambia semplicemente il percorso del codice. –

risposta

0

Come da documentazione:

Entrambi i metodi acquisisce permesso dal semaforo e il blocco fino a quando uno è disponibile. Ma il metodo acquire() viene interrotto, il che significa che sta bloccando fino a quando il thread non viene interuppolato e genera un'eccezione Interrupt (che è selezionata una).

Ma acquisizioneUninterruptibly() non ha effetto quando il thread viene interrotto, mantiene lo stato del blocco finché non ottiene il permesso dal semaforo.

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

1

acquire() è interrompibile. Ciò significa che se un thread A chiama acquire() su un semaforo, e filo B interrupt discussioni Un chiamando interrupt(), quindi un InterruptedException saranno lanciati sul filo A.

D'altra parte non è acquireUninterruptibly() interrompibile. Ciò significa che se un thread A sta chiamando acquireUninterruptibly() su un semaforo e il thread B interrompe i thread A chiamando interrupt(), quindi non verrà generato InterruptedException nel thread A, solo il thread A avrà lo stato interrotto impostato dopo i ritorni acquireUninterruptibly().

Problemi correlati