PDA

View Full Version : [java] Deadlock e dintorni


raniero
03-10-2005, 17:04
Ciao a tutte le menti eccelse del forum, questo e' il mio problema ( un po' incasinato). Il mio programma dovrebbe far si che 2 meccanici (thread)setaccino una matrice di lavori compsta da n chiavi. Il numero di chiavi e' limitato, quindi se un operaio utilizza delle chiavi che servono all'altro, quest'ultimo deve aspettare finche non ha disponibili tutte le chiavi.
Il fulcro del mio problema e' che quando l'operaio 2 va in wait non ne esce piu' anche se l'operaio 1 chiama la funzione Signal.

Ecco i file in questione: Controllore.java



import monitor.*;


public class Controllore extends Monitor{

public static Lavori q;
Cond coda;

static int occupati=0;
static int sospesi=0;
static int zero_chiaveinglese=3;
static int uno_chiavebrugola=3;
static int due_pinza=3;
static int tre_martello=1;
int pos0=0;
int pos1=0;
int pos2=0;
int pos3=0;
static int i=1;
static int t=1;


public synchronized void scandisciRiga(){

coda = new Cond (this);

entraMonitor();




for(int j = 2; j < 6; j++){

switch (q.macchine[i][j]) {
case 0 :
pos0++;
break;
case 1 :
pos1++;
break;
case 2 :
pos2++;
break;
case 3 :
pos3++;
break;}
}
while ((zero_chiaveinglese <pos0) || (uno_chiavebrugola <pos1) ||
(due_pinza <pos2) || (tre_martello <pos3))
{
System.out.println(" ................mi devo sospendere..........");
sospesi++;
coda.Wait() ;
sospesi--;
}

System.out.println(" lavoro disponibile " +i);
System.out.println(" ");
System.out.println( " prendo le chiavi " +q.macchine[i][2] +" "+q.macchine[i][3] +
" " +q.macchine[i][4]+ " "+q.macchine[i][5]);

System.out.println(" il tempo di fermata......... " +q.macchine[i][6] + " minuti ");


zero_chiaveinglese = zero_chiaveinglese-pos0;
uno_chiavebrugola =uno_chiavebrugola-pos1;
due_pinza = due_pinza-pos2;
tre_martello =tre_martello-pos3;




occupati++;
System.out.println(" MECCANICI occupati " +occupati);
i++;


esciMonitor();
} // fine scandisci


public synchronized void rilascia() {

entraMonitor();



for(int j = 2; j < 6; j++){

switch (q.macchine[t][j]) {
case 0 :
pos0--;
zero_chiaveinglese++;
break;
case 1 :
pos1--;
uno_chiavebrugola++;
break;
case 2 :
pos2--;
due_pinza++;
break;
case 3 :
pos3--;
tre_martello++;
break;}
}
occupati--;


System.out.println(" ");
System.out.println(" Lavoro " + t + " terminato in " +q.macchine[t][6]+ " minuti");
System.out.println(" ");
System.out.println( " numero di chiavi 0 rimesse a posto " +zero_chiaveinglese);
System.out.println( " numero di chiavi 1 rimesse a posto " +uno_chiavebrugola);
System.out.println( " numero di chiavi 2 rimesse a posto " +due_pinza);
System.out.println( " numero di chiavi 3 rimesse a posto " +tre_martello);
System.out.println( " ");
System.out.println(" MECCANICI SOSPESI " +sospesi);

int s = sospesi ;
for (int g=0; g<s; g++){
System.out.println("HO CHIAMATO SIGNAL ");
coda.Signal();} // questo non sembra funzionare!!!!

t++;
esciMonitor();

} // fine rilascia

}


il secondo file Meccanico. java :





public class Meccanico extends Thread {
Controllore z;
Lavori q;



public void run() {
z = new Controllore();

for (int u=0; u<q.b;u++){
System.out.println(" ");
System.out.println("Thread in esecuzione: " +this.getName( ) );
System.out.println("Vedo che lavori ce so ");
System.out.println(" ");
z.scandisciRiga();
try {
sleep((q.macchine[z.i][6]));

} catch (InterruptedException e) {}
z.rilascia();

}

}


}