Thread Programmierung/Multithreading Beispiel


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