Codice: Seleziona tutto
Una pizzeria ha N tavoli che possono ospitare 2, 4 o 6 persone ciascuno, più un tavolo comunitario da 20 posti. I clienti arrivano a gruppi di massimo 10 persone che, chiaramente, non vanno separate. Se possibile, un gruppo viene preferibilmente fatto accomodare in uno dei tavoli piccoli cercando di ottimizzarne l’occupazione
(in altre parole, cercando di lasciare il minor numero possibile di posti vuoti). Altrimenti il gruppo viene fatto accomodare nel tavolo comunitario insieme ad altri gruppi; infine, se nemmeno lì c’è posto, il gruppo viene messo in attesa. Una volta seduti, i clienti di un gruppo ordinano e consumano, impiegando per queste azioni un tempo che può essere simulato di durata casuale, ed infine liberano il tavolo.
Si modelli lo scenario descritto mediante thread in linguaggio Java usando il costrutto monitor e si descriva la sincronizzazione tra thread, discutendo anche se la soluzione proposta può presentare rinvio indefinito o deadlock.
Codice: Seleziona tutto
//Tavolo.java
public class Tavolo {
private int id;
private int posti;
private int posti_occupati;
public Tavolo(int id, int posti){
this.id = id;
this.posti = posti;
this.posti_occupati = 0;
}
int getID(){
return id;
}
int getOccupati(){
return this.posti_occupati;
}
int getPosti(){
return this.posti;
}
void setOccupati(int posti_occupati){
this.posti_occupati = posti_occupati;
}
}
/*************************************************/
//Gruppo.java
public class Gruppo {
private int id;
private int membri;
private boolean attesa;
private int id_tavolo;
public Gruppo(int id, int membri){
this.id = id;
this.membri = membri;
this.attesa = true;
this.id_tavolo = 0;
}
int getID(){
return this.id;
}
int getTavolo(){
return this.id_tavolo;
}
void setTavolo(int id_tavolo){
this.id_tavolo = id_tavolo;
}
int getMembri(){
return this.membri;
}
boolean attesa(){
return this.attesa;
}
void attesa(boolean attesa){
this.attesa = attesa;
}
}
/******************************************/
//Locale.java
import java.util.LinkedList;
import java.util.Random;
public class Locale implements Runnable {
private LinkedList<Tavolo> tavoli;
private LinkedList<Gruppo> gruppi;
private int group_counter;
Random r = new Random();
public Locale(){
for(int i=1; i<=7; ++i){
tavoli.add(new Tavolo(i, 2));
}
for(int i=8; i<=14; ++i){
tavoli.add(new Tavolo(i, 4));
}
for(int i=15; i<=19; ++i){
tavoli.add(new Tavolo(i, 6));
}
tavoli.add(new Tavolo(1, 20));
group_counter = 1;
}
public synchronized void creaGruppi(){
Gruppo g = new Gruppo(group_counter, r.nextInt(10)+1);
System.out.println("è arrivato il gruppo n°"+g.getID());
gruppi.add(g);
++group_counter;
}
public synchronized boolean siedi(){
for(Tavolo i: tavoli){
if((i.getPosti() - i.getOccupati()) >= gruppi.getFirst().getMembri()){
i.setOccupati(gruppi.getFirst().getMembri() + i.getOccupati());
gruppi.getFirst().attesa(false);
gruppi.getFirst().setTavolo(i.getID());
return true;
}
}
return false;
}
public synchronized boolean alza(){
if(gruppi.getFirst().getTavolo() == 0){
System.out.println("è ancora alzato!");
return false;
}else{
int temp = tavoli.get(gruppi.getFirst().getTavolo()).getOccupati();
tavoli.get(gruppi.getFirst().getTavolo()).setOccupati(gruppi.getFirst().getMembri() - temp);
System.out.println("Il gruppo "+ gruppi.getFirst().getID() + "è andato via!");
gruppi.removeFirst();
return true;
}
}
@Override
public void run(){
while(true){
if(gruppi.size() < 20){
creaGruppi();
if(!siedi()){
System.out.println("Tavoli Occupati!");
}else{
System.out.println("Il gruppo " + gruppi.getFirst().getID() +
" si è seduto al tavolo n°" +
gruppi.getFirst().getTavolo());
}
try {
Thread.currentThread().sleep(r.nextLong()*1000);
} catch (Exception e) {
e.printStackTrace();
}
}else{
alza();
if(!siedi()){
System.out.println("Tavoli Occupati!");
}else{
System.out.println("Il gruppo " + gruppi.getFirst().getID() +
" si è seduto al tavolo n°" +
gruppi.getFirst().getTavolo());
}
try {
Thread.currentThread().sleep(r.nextLong()*1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*********************************************/
//Main.java
public class Main {
public static void main(String[] args) {
Locale r = new Locale();
Thread t = new Thread(r);
t.start();
}
}
Un'altra cosa: all'esecuzione mi da questo errore:
Codice: Seleziona tutto
Exception in thread "main" java.lang.NullPointerException
at Locale.<init>(Locale.java:15)
at Main.main(Main.java:5)
Java returned: 1
BUILD FAILED (total time: 0 seconds)