Semáforo
Utilización de un semáforo
La clase Semaphore
Shared.java
class Shared { static int count = 0; }
MyThreadUp.java
import java.util.concurrent.Semaphore; class MyThreadUp extends Thread { Semaphore semaphore; String threadName; public MyThreadUp(Semaphore s, String threadName) { super(threadName); this.semaphore = s; this.threadName = threadName; } @Override public void run() { System.out.println("Starting " + threadName); try { // First, get a permit. System.out.println(threadName + " is waiting for a permit."); // acquiring the lock semaphore.acquire(); System.out.println(threadName + " gets a permit."); // Now, accessing the shared resource. // other waiting threads will wait, until this thread release the lock for (int i = 0; i < 5; i++) { Shared.count ++; System.out.println(threadName + ": " + Shared.count); // Now, allowing a context switch -- if possible. // for others threads to execute Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println(e); } // Release the permit. System.out.println(threadName + " releases the permit."); semaphore.release(); } }
MyThreadDown.java
import java.util.concurrent.Semaphore; class MyThreadDown extends Thread { Semaphore semaphore; String threadName; public MyThreadDown(Semaphore s, String threadName) { super(threadName); this.semaphore = s; this.threadName = threadName; } @Override public void run() { System.out.println("Starting " + threadName); try { // First, get a permit. System.out.println(threadName + " is waiting for a permit."); // acquiring the lock semaphore.acquire(); System.out.println(threadName + " gets a permit."); // Now, accessing the shared resource. // other waiting threads will wait, until this thread release the lock for (int i = 0; i < 5; i++) { Shared.count --; System.out.println(threadName + ": " + Shared.count); // Now, allowing a context switch -- if possible. // for others threads to execute Thread.sleep(2000); } } catch (InterruptedException e) { System.out.println(e); } // Release the permit. System.out.println(threadName + " releases the permit."); semaphore.release(); }
Main.java
import java.util.concurrent.Semaphore; public class Main { public static void main(String[] args) { // creating a Semaphore object // with number of permits 1 Semaphore semaphore = new Semaphore(1); // creating two threads with name A and B // Note that thread A will increment the count // and thread B will decrement the count MyThreadUp mt1 = new MyThreadUp(semaphore, "Up"); MyThreadDown mt2 = new MyThreadDown(semaphore, "Down"); // stating threads A and B mt1.start(); mt2.start(); // waiting for threads A and B try { mt1.join(); mt2.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } // count will always remain 0 after // both threads will complete their execution System.out.println("count: " + Shared.count); } }
Semáforo (puntos 6.3.4 y 6.3.5)
Comunicación entre hilos
Problema de los Lectores-Escritores
Ejemplo de lectores escritores
Ejercicio 5 de la tarea online
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.