Salve sto cercando di svolgere un esercizio per l'UNI in cui mi si chiede di sincronizare più thread in modo che si verifichi una predefinita sequenza di essi.
Di seguito le classi create da me:
do per scontato che chi aiuterà conosca cosa fanno le classi SemaforoBinario e SemaforoContatore:
SYNCH:
codice:
public class SynchSem{ // usato per sincronizzare i thread
private SemaforoBinario mutexA = new SemaforoBinario(1);
private SemaforoBinario mutexB = new SemaforoBinario(1);
private SemaforoCont sA = new SemaforoCont(0);
private SemaforoCont sB = new SemaforoCont(0);
@Override
public void passaA(){
sA.P();
System.out.println("Sezione critica "+Thread.currentThread().toString());
sB.V();
}
@Override
public void passaB() {
mutexB.P();
sA.V();
sB.P();
System.out.println("Sezione critica "+Thread.currentThread().toString());
sA.V();
sB.P();
sA.V();
sB.P();
sB.V();
mutexB.V();
}
}
A (B uguale ad A):
codice:
public class A extends Thread{
private Synch s;
private int id;
public A(int ID, Synch S ){
super(""+ID);
s=S;
id=ID;
}
@Override
public void run(){
delay(1000,6000);
s.passaA();
}
@Override
public String toString(){ return "A#"+id; }
private void delay(int min, int max){ // lo uso per avere tutti i thread a start nel main
try{
sleep( Math.round(Math.random()*(max-min))+min );
}catch(InterruptedException exc){}
}
}
MAIN:
codice:
public static void main(String[] args) {
Synch s = new SynchSem();
A a1 = new A(1,s);
A a2 = new A(2,s);
A a3 = new A(3,s);
B b1 = new B(1,s);
B b2 = new B(2,s);
a1.start();
a2.start();
a3.start();
b1.start();
b2.start();
}
La sequenza dovrebbe essere ABAAB, fino a ABA tt ok....
poi non va più, alle volte arriva anche a stampare ABAA, ma l'ultima B proprio mai.
Help me, please!