Un ponte contiene una sola corsia di traffico consentendo così l'accesso a macchine provenienti da una sola direzione per volta, a senso unico alternato. Si identifichi ciascuna macchina con un processo (ci saranno quindi due tipi di processo, le macchine provenienti da nord e le macchine provenienti da sud) e si scriva un programma che sincronizzi l'accesso delle auto sul ponte, facendo uso dei costrutti monitor e regioni
critiche condizionali.Si tenga conto che:
non esistono priorità tra i processi;
un processo può attraversare il ponte solo se non vi sono sopra processi dell'altro tipo.
THREAD2
codice:package strada; /** */ public class Sud extends Thread{ private Ponte ponte; public Sud(Ponte ponte){ this.ponte=ponte; } @Override public void run(){ System.out.println("Auto sud vuole entrare"); ponte.EntraSud(); try{ sleep(2); }catch(InterruptedException e){ System.out.println(e); } ponte.EsciSud(); } }
THREAD 1
OGGETTO CONDIVISOcodice:/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package strada; /** public class Nord extends Thread{ private Ponte ponte; public Nord(Ponte ponte){ this.ponte=ponte; } @Override public void run(){ System.out.println("Auto nord vuole entrare"); ponte.EntraNord(); try{ sleep(2); }catch(InterruptedException e){ System.out.println(e); } ponte.EsciNord(); } }
codice:/* */ package strada; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * */ public class Ponte { ReentrantLock lock; Condition nord,sud; private int NordIn=0; private int SudIn=0; public Ponte(){ this.lock=new ReentrantLock(); this.nord =this.lock.newCondition(); this.sud =this.lock.newCondition(); } public void EntraNord(){ this.lock.lock(); try{ while(SudIn>0) this.nord.await(); System.out.println("Auto nord attraversa il ponte"); NordIn++; }catch(InterruptedException e ){ System.out.println(e); }finally{ this.lock.unlock(); } } public void EntraSud(){ this.lock.lock(); try{ while(NordIn>0) this.sud.await(); System.out.println("Auto sud attraversa il ponte"); SudIn++; }catch(InterruptedException e ){ System.out.println(e); }finally{ this.lock.unlock(); } } public void EsciNord(){ this.lock.lock(); try{ System.out.println("Auto esce da nord"); NordIn--; if(NordIn==0) this.sud.signal(); }finally{ this.lock.unlock(); } } public void EsciSud(){ this.lock.lock(); try{ System.out.println("Auto esce da sud"); SudIn--; if(SudIn==0) this.nord.signal(); }finally{ this.lock.unlock(); } } }
MAIN
codice:package strada; /** */ public class Strada { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Ponte ponte = new Ponte(); Sud []sud = new Sud[10]; Nord []nord = new Nord[10]; for(int i=0;i<10;i++) { sud[i]= new Sud(ponte); nord[i] = new Nord(ponte); } for(int i=0;i<10;i++) { sud[i].start(); nord[i].start(); } for(int i=0;i<10;i++) try{ sud[i].join(); nord[i].join(); }catch(InterruptedException e){ System.out.println(e); } } }
Questo è il mio programma.
Sembra funzionare tutto. Il problema è nel finale quando il programma rimane in running senza bloccarsi. Dove sbaglio?

Rispondi quotando