Semáforo
Utilización de un semáforo
La clase Semaphore
Shared.java
class Shared
{
static int count = 0;
}
class Shared
{
static int count = 0;
}
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();
}
}
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();
}
}
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();
}
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();
}
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);
}
}
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);
}
}
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.