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; } }