Professional Documents
Culture Documents
TP N°3
SÉMAPHORES - CORRECTION
Barrière de Synchronisation
CLASSE PROCESSUS
package rdv;
class Processus extends Thread {
private RendezVous rv;
public Processus(RendezVous rv) {
this.rv = rv;
}
public void run() {
try {
Thread.sleep(6000 * (int) Math.random());
rv.proc_rdv();
} catch (InterruptedException e) {}
}
}
CLASSE MAIN
package rdv;
public class Main {
public static void main(String argv[]) {
int N = Integer.parseInt(argv[0]);
RendezVous rv = new RendezVous(N);
Processus process[] = new Processus[N];
for (int i = 0; i < N; i++) {
process[i] = new Processus(rv);
process[i].setName("Processus" + i);
process[i].start();
}
}
}
CLASSE RENDEZ-VOUS
package rdv;
import java.util.concurrent.Semaphore;
public class RendezVous {
private int nbArrives;
private int N;
private Semaphore s;
private Semaphore mutex;
public RendezVous(int MaxProcess) {
nbArrives = 0;
s = new Semaphore(0, true);
mutex = new Semaphore(1, true);
N = MaxProcess;
}
public void proc_rdv() throws InterruptedException {
mutex.acquire();
nbArrives = nbArrives + 1;
if (nbArrives < N) {
mutex.release();
System.out.println(Thread.currentThread().getName()
+ " se bloque ");
s.acquire();
} else {
mutex.release();
System.out.println(Thread.currentThread().getName()
+ " est le dernier, il reveille les autres"
+ " processus ("+nbArrives+" sont arrivés)");
for (int i = 1; i <= N - 1; i++)
s.release();
}
}
}
Producteur/Consommateur
CLASSE ITEM
package prodConsVect;
CLASSE MAIN
package prodConsVect;
CLASSE PRODUCTEUR
package prodConsVect;
import java.util.Vector;
import java.util.concurrent.Semaphore;
public class Producteur extends Thread {
private Vector<Item> v;
private Semaphore full;
private Semaphore empty;
private Semaphore mutex;
public Producteur(Vector<Item> v, Semaphore full, Semaphore empty,
Semaphore mutex) {
super();
this.v = v;
this.full = full;
this.empty = empty;
this.mutex = mutex;
}
public void run() {
while (true) {
try {
empty.acquire();
mutex.acquire();
Item i = new Item(Math.random());
v.add(i);
System.out.println("Produced : " + i.item);
mutex.release();
full.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
CLASSE CONSOMMATEUR
package prodConsVect;
import java.util.Vector;
import java.util.concurrent.Semaphore;
public class Consommateur extends Thread {
private Vector<Item> v;
private Semaphore full;
private Semaphore empty;
private Semaphore mutex;
public Consommateur(Vector<Item> v, Semaphore full, Semaphore empty,
Semaphore mutex) {
super();
this.v = v;
this.full = full;
this.empty = empty;
this.mutex = mutex;
}
public void run() {
while (true) {
try {
full.acquire();
mutex.acquire();
Item i = v.firstElement();
System.out.println("Consumed : " + i.item);
mutex.release();
empty.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}