package Restauracja;
import java.util.ArrayList;
import java.util.Random;
import java.util.Timer;
/**
*
* @author LoL1
*/
public class Restaurant {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws InterruptedException {
// TODO code application logic here
int ile_klientów=50;
int co_ile_przychodza=5000;
int z_jakim_odchyleniem=3000;
Random los = null;
Klient konkret;
Thread watek;
Obsluga obsluga=new Obsluga(10, 20, 5, 4, 3, 8);
ArrayList<Klient> klient = new ArrayList<>();
Timer timer;
for(int i=0; i<ile_klientów;i++){
klient.add(new Klient(i, 5, 5, 3, obsluga, 1000));
}
for(int i=0;i<ile_klientów;i++){
konkret=klient.get(i);
konkret.start();
Thread.sleep((int)(los.nextGaussian()*z_jakim_odchyleniem+co_ile_przychodza));
}
}
}
===========================================================================
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Restauracja;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author LoL1
*/
public class Klient extends Thread{
private int doStolika;
private int bazowyCzasJedzenia;
private int odchylenieCzasuJedzenia;
private Obsluga obsluga;
private int parametrCzasu;
private Random los;
private int id;
Klient(int id, int doStolika, int bazowyCzasJedzenia, int odchylenieCzasuJedzenia, Obsluga obsluga, int parametrCzasu){
this.doStolika=doStolika;
this.bazowyCzasJedzenia=bazowyCzasJedzenia;
this.odchylenieCzasuJedzenia=odchylenieCzasuJedzenia;
this.obsluga=obsluga;
this.parametrCzasu=parametrCzasu;
this.id=id;
}
private int jem(){
return (int)(los.nextGaussian()*odchylenieCzasuJedzenia+bazowyCzasJedzenia);
}
@Override
public void run() {
if(obsluga.CzyStolikWolny()){
System.out.println(id+": Ide do stolika");
try {
obsluga.ZajmijStolik();
Thread.sleep(doStolika*parametrCzasu);
if(Math.random()>0.5){
System.out.println(id+": Sprawdzam czu bufet wolny");
while(!obsluga.CzyBufetWolny()) wait();
System.out.println(id+": Zajmuje bufet");
Thread.sleep(obsluga.ZajmijBufet()*parametrCzasu);
obsluga.OpuscBufet();
notifyAll();
}
else{
System.out.println(id+": Sprawdzam czy kelner wolny");
while(!obsluga.CzyKelnerWolny()) wait();
System.out.println(id+": Zajmuje kelnera");
Thread.sleep(obsluga.ZajmijKelnera()*parametrCzasu);
System.out.println(id+": Jem");
Thread.sleep(jem()*parametrCzasu);
obsluga.OpuscKelnera();
notifyAll();
}
} catch (InterruptedException ex) {
Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
}
}
else System.out.println(id+": Nie było wolnych stolików ide sobie.");
}
}
===========================================================================
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Restauracja;
import java.util.Random;
/**
*
* @author LoL1
*/
public class Obsluga {
private int ilosc_miejsc_bufet;
private int ilosc_stolik;
private int ilosc_kelner;
private int czas_pierwszego_dania;
private int czas_drugiego_dania;
private int czas_bazowy_bufetu;
private Random los;
Obsluga(int ilosc_miejsc_bufet, int ilosc_stolik, int ilosc_kelner,int czas_bazowy_bufetu, int czas_pierwszego_dania, int czas_drugiego_dania){
this.ilosc_miejsc_bufet=ilosc_miejsc_bufet;
this.ilosc_stolik=ilosc_stolik;
this.ilosc_kelner=ilosc_kelner;
this.czas_bazowy_bufetu=czas_bazowy_bufetu;
this.czas_pierwszego_dania=czas_pierwszego_dania;
this.czas_drugiego_dania=czas_drugiego_dania;
}
public boolean CzyStolikWolny(){
boolean aha=false;
if(ilosc_stolik>0) aha=true;
return aha;
}
public boolean CzyBufetWolny(){
boolean aha=false;
if(ilosc_miejsc_bufet>0) aha=true;
return aha;
}
public boolean CzyKelnerWolny(){
boolean aha=false;
if(ilosc_kelner>0) aha=true;
return aha;
}
public synchronized void ZajmijStolik(){
ilosc_stolik--;
}
public synchronized void OpuscStolik(){
ilosc_stolik++;
}
public synchronized int ZajmijBufet(){
ilosc_miejsc_bufet--;
return (int) (los.nextGaussian()*ilosc_miejsc_bufet+czas_bazowy_bufetu);
}
public synchronized void OpuscBufet(){
ilosc_miejsc_bufet++;
}
public synchronized int ZajmijKelnera(){
ilosc_kelner--;
return czas_pierwszego_dania+czas_drugiego_dania;
}
public synchronized void OpuscKelnera(){
ilosc_kelner++;
}
}
Wywala mi takie coś:
0: Ide do stolika
Exception in thread "main" java.lang.NullPointerException
at Restauracja.Restaurant.main(Restaurant.java:39)
0: Sprawdzam czy kelner wolny
0: Zajmuje kelnera
0: Jem
Exception in thread "Thread-0" java.lang.NullPointerException
at Restauracja.Klient.jem(Klient.java:34)
at Restauracja.Klient.run(Klient.java:58)
Java Result: 1