Um nebenläufig zu programmieren gibt es Threads in Java. Am Beispiel eines Parkhauses, in welches Auto Threads einfahren wollen, wenn das Parkhaus nicht voll ist.
public class Main {
public static void main(String[] args) {
Parkhaus parkhaus = new Parkhaus();
for (int i = 0; i < 100; i++)
{
Auto auto = new Auto(parkhaus);
Thread thread = new Thread(auto);
thread.start();
}
}
}
import java.sql.Timestamp;
import java.util.Date;
public class Auto implements Runnable
{
private String _nummernSchild = "";
private int _startzeitInMilliSekunden = 0;
private int _parkdauerInMilliSekunden = 0;
private Parkhaus _parkhaus = null;
public Auto(Parkhaus parkhaus)
{
_parkhaus = parkhaus;
_startzeitInMilliSekunden = this.gibZufallszahl(20,50);
_parkdauerInMilliSekunden = this.gibZufallszahl(20,50);
_nummernSchild = "B - " + this.gibZufallszahl(1000,9999);
// System.out.println("Neues Auto erstellt. NummernSchild: " + _nummernSchild + " StartzeitInMilliSekunden: " + _startzeitInMilliSekunden + " ParkdauerInMilliSekunden : " + _parkdauerInMilliSekunden);
}
/*
* Wenn der Thread gestartet wird, wartet das Auto eine bestimmte Startzeit und versucht dann,
* in das Parkhaus zu fahren. Wenn das Parkhaus frei ist, wird geparkt und eine bestimmte Zeit gewartet,
* bis hinausgefahren wird.
*/
public void run() {
// System.out.println("Auto Thread gestartet. NummernSchild: " + _nummernSchild );
try {
Thread.sleep(_startzeitInMilliSekunden);
} catch (InterruptedException ex) {
System.out.println("Fehler: Thread Sleep abgebrochen");
}
if(einfahrenParkhaus())
{
try {
Thread.sleep(_parkdauerInMilliSekunden);
} catch (InterruptedException ex) {
System.out.println("Fehler: Thread Sleep abgebrochen");
}
rausfahrenParkhaus();
}
}
public int getStartzeit()
{
return _startzeitInMilliSekunden;
}
public boolean einfahrenParkhaus()
{
boolean eingefahren= false;
synchronized(_parkhaus){
if(_parkhaus.freieParkplaetze() > 0)
{
_parkhaus.einfahrenAuto(this);
System.out.println(this.getCurrentTimestamp() + " Eingefahren: " + _nummernSchild);
eingefahren = true;
}
else
{
System.out.println(this.getCurrentTimestamp() + " Parkhaus voll, fahre nach hause:" + _nummernSchild);
eingefahren = false;
}
}
return eingefahren;
}
public void rausfahrenParkhaus()
{
synchronized(_parkhaus){
_parkhaus.rausfahrenAuto(this);
System.out.println(this.getCurrentTimestamp() + " Rausgefahren: " + _nummernSchild);
}
}
private int gibZufallszahl(int minimum, int Maximum) {
return (int) ((Math.random() * Maximum) + 1 + minimum);
}
private Timestamp getCurrentTimestamp()
{
Date date= new java.util.Date();
return new Timestamp(date.getTime());
}
}
public class Parkhaus {
private int _anzahlPlaetze = 10;
private int _freiePlaetze = 0;
public Parkhaus()
{
_freiePlaetze = _anzahlPlaetze;
}
public void einfahrenAuto(Auto auto)
{
if(_freiePlaetze > 0)
{
_freiePlaetze--;
}
else
{
throw new IllegalStateException();
}
}
public void rausfahrenAuto(Auto auto)
{
if(_freiePlaetze < _anzahlPlaetze && _freiePlaetze >= 0)
{
_freiePlaetze++;
}
else
{
throw new IllegalStateException();
}
}
public int freieParkplaetze()
{
return _freiePlaetze;
}
}
