semafori in java

Qui lascio un esempio per il modello utilizzando un semaforo:

import java.security.SecureRandom;import java.util.concurrent.Semaphore;import java.util.concurrent.atomic.AtomicInteger;/** * @author snolde * */public class Tuberia { class Hilo extends Thread{ int id; public Hilo(int id){ this.id=id; } @Override public void run() { hil(id); } } static SecureRandom sr = new SecureRandom(); Semaphore guardia; AtomicInteger count = new AtomicInteger(0); public Tuberia(int limite){ guardia = new Semaphore(limite, true); } public void hil(int id){ try { guardia.acquire(); } catch (InterruptedException e) {} synchronized(count){ System.out.println(String.format("Hilo %d entró (%d)", id, count.incrementAndGet())); } try { // simulación de código productivo, carga de 500-1000 ms Thread.sleep(500+sr.nextInt(500)); } catch (InterruptedException e) {} synchronized(count){ System.out.println(String.format("Hilo %d salió (%d)", id, count.decrementAndGet())); } guardia.release(); } public void creaHilos(int num){ for (int i = 1; i<=num; i++){ new Hilo(i).start(); try { // variable Thread.sleep(10); } catch (InterruptedException e) {} } } public static void main(String args) { Tuberia tub = new Tuberia(5); tub.creaHilos(10); }}

con la classe Hilo dichiarato come classe interna non è necessario per spiegare il riferimento a Tuberia perché ha accesso a i metodi della classe genitore.

Il contatore è incluso nei blocchi corti sincronizzati per garantire che gli eventi siano stampati nella sequenza che si verificano.

Il semaforo nell’esempio limita il Numero di thread che hanno accesso al codice tra acquire e release.

La principale differenza tra le due implementazioni È che con il semaforo ci sono un numero di thread che possono accedere al codice contemporaneamente mentre il metodo sincronizzato garantisce che solo un thread può accedere a questo blocco di codice, rendendolo un’azione atomica.

Se questo Né un senso non è visibile in un esempio così fondamentale, senza pensare che sia davvero il lavoro che fanno i fili e quali risorse hanno bisogno per questo.

per sperimentare il comportamento, cambiare pause in generazione di nuovi Fili, il numero di fili, la quantità di autorizzazioni o il tempo casuale per il carico del codice.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *