PDA

View Full Version : [java] help elaborato


Solido
24-07-2008, 21:26
Ciao a tutti ragazzi ho bisogno di voi... oggi il prof mi ha voluto assegnare un elaborato java che consiste in questo:
c'è una strada a doppio senso ma a un certo punto c'è una strettoia e possono passare le macchine in unico senso e per di più entro questa strettoia c'è la limitazione che + di "n" macchine non ci possono passare!
Chiaramente devo evitare deadlock e starvation!
ora mi chiedevo: meglio usare i metodi syncronized oppure i semafori?
considerate ragazzi che non ho mai fatto programmazione a oggetti quindi se avete anche delle dispense mi farebbero comodo, ho scaricato il manuale gratuito java ma...:mc:
il top sarebbe eseguirlo graficamente! che mi dite?
grazie in anticipo :)

Oceans11
25-07-2008, 07:30
Ciao!

oggi il prof mi ha voluto assegnare un elaborato java che consiste in questo:
c'è una strada a doppio senso ma a un certo punto c'è una strettoia e possono passare le macchine in unico senso e per di più entro questa strettoia c'è la limitazione che + di "n" macchine non ci possono passare!
Chiaramente devo evitare deadlock e starvation!
ora mi chiedevo: meglio usare i metodi syncronized oppure i semafori?

So che non si risponde con una domanda...ma visto che è una cosa didattica, non è che forse hai studiato le primitive wait e notify???Se la risposta è affermativa, perchè allora non implementare quelle? Intendo dire che per la gestione della acquisizione e rilascio della risorsa condivisa (la strettoia del ponte) secondo me ti devi proprio scordare delle librerie! :D


ho scaricato il manuale gratuito java ma...:mc:
il top sarebbe eseguirlo graficamente! che mi dite?
grazie in anticipo

Ti dico che se hai appena scaricato il manuale gratuito ma :mc:....beh allora forse ti conviene farlo testuale e amen.

Solido
25-07-2008, 12:39
si ho fatto il wait e notify ;)
tra l'altro usassi il notify non importerebbe mica usare il notify all?

Oceans11
25-07-2008, 13:31
no no....tu intendi il metodo della classe Object???

Io ti dicevo proprio di implementarlo per conto tuo...per esempio la wait:


public void wait(int semaforo) {
while(semaforo <= 0) {
; // non fa niente
}
semaforo--;
}


e la signal:


public void signal(int semaforo) {
semaforo++;
}

Solido
25-07-2008, 13:44
ahh ok :)

il top sarebbe fare anche un'animazione solo che nn so da che parte rifarmi...che dici? è impossibile?

Oceans11
25-07-2008, 16:51
il top sarebbe fare anche un'animazione solo che nn so da che parte rifarmi...che dici? è impossibile?


impossibile non è!!!però trovo già di per se abbastanza complicato integrare al programma vero e proprio, l'interfaccia utente e/o la grafica. In questo caso rischi di impelagarti in situazioni tipo:

"La grafica riproduce fedelmente il problema - qui non sembra funzionare niente - il problema deve essere l'implementazione del programma"

quando invece già la grafica ha i suoi problemi di gestione.

Cmq se proprio vuoi un punto da cui partire, inizia dal tutorial java della sun e vai al trail "gui with JFC/SWING" (o una cosa del genere) e poi vai giù di fantasia!!! :D (sicuramente c'è più di un valido modo per produrre qualcosa di graficamente accettabile)

Solido
25-07-2008, 17:20
penso che mi limiterò all'implementazione del solo programma ammesso mi riesca dato che non ci metto le mani :D

Solido
28-08-2008, 20:09
Ragazzi ho terminato l'elaborato ma mi manca una cosa... una volta terminato volevo che comparisse la scritta: le macchine non possono + passare perchè i ponte è crollato....solo che non la inserisco nel punto giusto e mi compare + di una volta...
questo è il codice:
(nn fate caso al commento del try catch che era na prova :D )


import java.io.*;// inporto tutte le classi java.io

// l'oggetto Ponte è condiviso dai thread
// delle classi autoN e autoS

class Ponte{

private int cont;
private boolean autoN;
private boolean autoS;
private int num_auto;

// Costruttore della classe Ponte
public Ponte(int n){

this.num_auto = n;
cont = 0;
autoN = false;
autoS = false;
}

//metodo sincronizzato sull'oggetto Ponte
public synchronized void entraN(){ // entra in wait nel caso che nel ponte siano presenti
while(autoS == true || cont >= num_auto){ //macchine provenienti da sud oppure se la capienza
try{ //max sia stata superata
wait();
}
catch(InterruptedException ie){}
}
cont++;
autoN = true;
}

//metodo sincronizzato sull'oggetto Ponte
public synchronized void entraS(){
while(autoN == true || cont >= num_auto){ // entra in wait nel caso che nel ponte siano presenti
try{ //macchine provenienti da nord oppure se la capienza
wait(); //max sia stata superata
}
catch(InterruptedException ie){}
}
cont++;
autoS = true;

}

//metodo sincronizzato sull'oggetto Ponte
public synchronized void esceN(){
cont--;
notify(); // risveglio comunque un thread per ogni macchina che esce. Il thread poi
// provvederà a verificare se ci sono le condizioni per entrare sul ponte
if(cont == 0){
autoN = false;
System.out.println("Adesso sul ponte non sono presenti macchine");
notifyAll(); // nel caso del ponte vuoto risveglio tutti i thread
}
}

//metodo sincronizzato sull'oggetto Ponte
public synchronized void esceS(){
cont--;
notify(); // risveglio comunque un thread per ogni macchina che esce. Il thread poi
// provvederà a verificare se ci sono le condizioni per entrare sul ponte
if(cont == 0){
autoS = false;
System.out.println("Adesso sul ponte non sono presenti macchine");
notifyAll(); // nel caso del ponte vuoto risveglio tutti i thread
}
}
}

class autoN extends Thread{

private Ponte ponte;
private int id;
private int count;

//costruttore della classe autoN
public autoN(Ponte ponte, int id){

count=0;
this.ponte=ponte;
this.id=id;
}

public void run(){
while(count<7){
ponte.entraN();
entra();
ponte.esceN();
count++;
ferma();
}
}

public void entra(){
System.out.println("L'auto "+id+" da nord entra.");
try{
Thread.sleep(1000-10*id); //tempo arbitrario di attesa della singola macchina
} // all'interno del ponte
catch(InterruptedException ie){}
}

public void ferma(){
try{
Thread.sleep(1000-10*id); // attesa arbitraria all'uscita del ponte
}
catch(InterruptedException ie){}
}

}

class autoS extends Thread{

private Ponte ponte;
private int id;
private int count;

public autoS(Ponte ponte, int id){

count=0;
this.ponte=ponte;
this.id=id;
}

public void run(){
// numero arbitrario di volte che una certa macchina può attraversare il ponte
//try {
while(count<7){

ponte.entraS();
entra();
ponte.esceS();
count++;
ferma();
if ( count==7)
{System.out.println(" Il ponte è crollato e non possono passare più macchine");
}
// }
// catch( Exception e)
// {}
// finally {
// System.out.println(" Il ponte è crollato e non possono passare più macchine");
// }
}
}
public void entra(){
System.out.println("L'auto "+id+" da sud entra.");
try{
Thread.sleep(1000-10*id); //tempo arbitrario di attesa della singola macchina
} // all'interno del ponte

catch(InterruptedException ie){}
}

public void ferma(){
try{
Thread.sleep(1000-10*id); // attesa arbitraria all'uscita del ponte
}
catch(InterruptedException ie){}
}
}

public class Automobile{

private static BufferedReader input = new BufferedReader(new InputStreamReader( System.in ) );

public static void main(String[] args){

int n=0;
int k=0;
int h=0;

System.out.print("Inserisci di seguito il numero di macchine che possono stare contemporaneamente sul ponte: ");
try{
n = Integer.parseInt(input.readLine()); // acquisizione da linea di comando
}
catch(IOException ioe){}

System.out.print("Inserisci il numero di macchine che partono da nord e vanno in direzione sud: ");
try{
k = Integer.parseInt(input.readLine());
}
catch(IOException ioe){}

System.out.print("Inserisci il numero di macchine che partono da sud e vanno in direzione nord: ");
try{
h = Integer.parseInt(input.readLine());
}
catch(IOException ioe){}


Ponte ponte = new Ponte(n);

for(int i=0; i<=k; i++){
autoN nord = new autoN(ponte,i);
nord.start();
}

for(int i=0; i<h; i++) {
autoS sud = new autoS(ponte,i);
sud.start();
}
}
}