Ciao a tutti.
Ho il seguente esercizio: Ho una squadra di operai che devono costruire le pareti di una casa a base quadrata.
Gli operai sono divisi in due categorie: quelli che mettono il cemento e quelli che mettono i mattoni
Ogni parete viene costruita alternando uno strato di cemento e uno di mattone, fino ad un numero N.
All'interno della classe mi viene chiesto di implementare due metodi:
-boolean inizia(int i) che sospende l'operaio fino a quando non è disponibile il lavoro di tipo T, restituisce false se non ci sono più lavori da effettuare, true altrimenti
-void termina(): permette all'operaio di comunicare che ha terminato il proprio lavoro.
Io ho implementato la classe Operaio nel seguente modo:
import java.util.concurrent.TimeUnit;
public class Muratore extends Thread {
private Casa casa;
private static int id;
private static int[] materiale = { 5, 7 };
private static final int TEMPO_LAVORO = 1;
private static final int TEMPO_RIPOSO = 5;
public Muratore(Casa casa, int id) {
this.casa = casa;
this.id = id;
}// costruttore
public void run() {
try {
preparaMateriale(materiale[id]);
while(casa.inizia(id)) {
// System.out.println("Il muratore di tipo "+id+" inizia il
// lavoro");
lavora(TEMPO_LAVORO);
// System.out.println("Il muratore di tipo "+id+" termina il
// lavoro");
casa.termina();
riposa(TEMPO_RIPOSO);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}// run
private void preparaMateriale(int m) throws InterruptedException {
TimeUnit.SECONDS.sleep(m);
}// preparaMateriale
private void lavora(int t) throws InterruptedException {
TimeUnit.SECONDS.sleep(t);
}// lavora
private void riposa(int t) throws InterruptedException {
TimeUnit.SECONDS.sleep(t);
}// riposa
}// Muratore
E la classe principale cosi:
public class CasaSem extends Casa {
private Semaphore mutex = new Semaphore(1);
private Semaphore[] muratori = new Semaphore[2];
private boolean termine = false;
private int indice = 0;
private int turno = -1;
public CasaSem(int fileMattoni) {
super(fileMattoni);
muratori[0]=new Semaphore(1);
muratori[1]=new Semaphore(0);
}// costruttore
@Override
public boolean inizia(int t) throws InterruptedException {
// sospende il muratore fin quando non è diponibile il lavoro t
// return false se non ci sono più lavori, true altrimenti
muratori[t].acquire();
if (numLavoriDaFare == 0) {
// muratori[t].release();
// muratori[1 - t].release();
return false;
} else {
System.out.println("Il muratore di tipo " + t + " inizia il lavoro");
return true;
}
}// inizia
@Override
public void termina() throws InterruptedException {
// permette al muratore di comunicare che ha terminato il proprio lavoro
mutex.release();
System.out.println("Il muratore di tipo " + turno+ " ha terminato il lavoro");
pareti[indice]++;
numLavoriDaFare--;
if (pareti[indice] == fileMattoni) {
indice++;
System.out.println("nuova parete");
muratori[turno].release();
} else {
System.out.println("Il muratore ha terminato il lavoro");
turno = (turno + 1) % 2;
muratori[turno].release();
}
mutex.release();
}// termina
public static void main(String[] args) {
int N = 6;
Casa casa = new CasaSem(N);
casa.test(5,7);
}// main
}// CasaSem
Ma il codice non va come dovrebbe andare. Qualcuno sa darmi qualche consiglio??
Grazie