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:
A (B uguale ad A):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(); } }
MAIN: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){} } }
La sequenza dovrebbe essere ABAAB, fino a ABA tt ok....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(); }
poi non va più, alle volte arriva anche a stampare ABAA, ma l'ultima B proprio mai.
Help me, please!![]()

Rispondi quotando

