Principio:
Definimos dos operaciones en semáforos:
* adquirir (adquirir) Cuando un subproceso llama a la operación de adquisición, adquirirá con éxito el semáforo (semáforo menos 1),
* o esperará hasta que un subproceso libere el semáforo, O tiempo de espera.
* release (release) en realidad aumentará el valor del semáforo y luego despertará el hilo de espera.
*
* Los semáforos se usan principalmente para dos propósitos, uno es para el uso mutuamente exclusivo de múltiples recursos compartidos, y el otro es para el control del número de hilos concurrentes.
import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; / ** * * @Description: TODO (en una oración para describir el papel de esta clase) * * en el semáforo Definimos dos operaciones anteriores: * adquirir (adquisición) Cuando un subproceso llama a la operación de adquisición, adquirirá con éxito el semáforo (semáforo menos 1), * o esperará hasta que un subproceso libere el semáforo o se agote el tiempo. * release (release) en realidad aumentará el valor del semáforo y luego despertará el hilo de espera. * * Los semáforos se usan principalmente para dos propósitos, uno es para el uso mutuamente exclusivo de múltiples recursos compartidos, y el otro es para el control del número de hilos concurrentes. * / public class SemaphoreDemo { public static void main (String [] args) { Semaphore semaphore = new Semaphore (3);// Simulación de 3 espacios de estacionamiento para ( int i = 1; i <= 6; i ++) // Simulación de 6 autos { new Thread (() -> { try { semaphore.acquire (); System.out.println ( Thread.currentThread (). GetName () + "\ t agarró el espacio de estacionamiento" ); TimeUnit.SECONDS.sleep ( new Random (). NextInt (5 )); System.out.println (Thread.currentThread (). GetName ( ) + "\ t ------- izquierda" ); } catch (InterruptedException e) { e.printStackTrace (); } finalmente{ semáforo.release (); } }, String.valueOf (i)). Start (); } } }