Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads)

V

Victoria_

Mitglied
Hallo an Alle,

ich habe ein paar Schwierigkeiten beim Beenden folgender Aufgabe:


Implementieren Sie die Klasse Notaufnahme, wie diese durch das UML-Diagramm vordefiniert wurde. Die Definition vorhandener Parkplätze vor der Notaufnahme wird über den Konstruktor der Klasse definiert. Die Anzahl der Parkplätze wird dekrementiert, wenn ein RTW einfährt und entsprechend inkrementiert, wenn der RTW wieder ausfährt.
  1. Implementieren Sie den Konstruktor der Klasse Notaufnahme. Stellen Sie bereits im Konstruktor sicher, dass mindestens 1 Parkplatz vor der Notaufnahme existieren. Andernfalls werfen Sie eine Exception.
  2. Die Methode getPlaces() soll die Anzahl der noch verfügbaren Parkplätze zurückliefern.
  3. Implementieren Sie die Methode einfahren(). Stellen Sie sicher, dass immer nur ein RTW zur gleichen Zeit einfahren kann. Sollten beim Einfahren keine Parkplätze sein, so wartet der RTW bis ein Parkplatz frei wird (wait()).
  1. ImplementierenSie die Methode ausfahren().
    1. TeilenSie den ggf. wartenden RTW mit, dass ein Platz freigeworden ist
    (notify()).
  2. Implementieren Sie die Methoden addRTW(...) und removeRTW(...) zum
    Aufnehmen/Entfernen des RTW zu Liste der Rettungswagen.
Java:
package Schritt2;
import java.util.ArrayList;

public class Notaufnahme {

    private int anzahlPlaetze;
    
    private ArrayList<Rettungswagen> parkendeRTWList;
    
    public Notaufnahme(int anzahlPlaetze, ArrayList<Rettungswagen> parkendeRTWList) {
        this.anzahlPlaetze = anzahlPlaetze;
        this.parkendeRTWList = parkendeRTWList;
        
        if (anzahlPlaetze == 0) {
            throw new IllegalArgumentException("Es muss mindestens 1 Platz existieren");
        }
    }
    
    public Notaufnahme(int numberplaces) {
        
    }
    
    public void einfahren() {
        
        Rettungswagen.wait();

        
    }
    
    public void ausfahren() {

    }
    
    public void addRTW(Rettungswagen rtw) {
        
        parkendeRTWList.add(rtw);
        
    }
    
    public void removeRTW(Rettungswagen rtw) {
        
        parkendeRTWList.remove(rtw);   
        
    }

    public int getPlaces() {
        return anzahlPlaetze;
    }
}

Bei Schritt 3+4 weiß ich nicht so recht, wie ich die wait() und notify() Methoden implementieren soll. In meinem Code kriege ich einen Fehler , wenn ich versuche die Methode mit Rettungswagen aufzurufen.


Des Weiteren habe ich keinen Plan wie ich die addRTW() und removeRTW() Methoden richtig aufrufen soll (3.3 und 3.7). Man muss ja den Rettungswagen der Methode übergeben, aber ich weiß einfach nicht wie ich das hinkriegen soll.


Implementieren Sie die Klasse Rettungswagen wie diese im UML Diagramm vorgegeben wurde. Jeder Rettungswagen hat ein eindeutiges Kennzeichen und gehört zu einer bestimmten Notaufnahme eines Krankenhauses. Ein Krankenhaus kann beliebig viele Rettungswagen besitzen.
  1. Implementieren Sie den Konstruktor der Klasse Rettungswagen. Beachten Sie dass, ein RTW nach Erzeugung des Objektes direkt genutzt werden kann und damit der zugehörige Thread gestartet werden muss.
  2. Implementieren Sie die Klasse getKennzeichen(), welche das eindeutige Kennzeichen des RTW zurückliefert.
  3. Ein Rettungswagen wird als Thread implementiert, da ein RTW jederzeit zu einem Notfall gerufen werden kann und anschließend in die Notaufnahme des Krankenhauses einfährt, bzw. diese verlässt. Implementieren Sie die Run- Methode der Klasse
    1. Ein RTW soll zunächst eine Weile unterwegs sein, bevor er in die Notaufnahme einfahren kann.
    2. NachdemderRTWindieNotaufnahmeeingefahrenistwirddiesaufder Konsole ausgegeben.
    3. Nach dem Einfahren wird der RTW mit Hilfe der Methode addRTW(...)der Klasse Notaufnahme in die Liste der parkenden RTW aufgenommen.
    4. Die Punkte 1-3 sollen unterbrechungsfrei (Atomar) ausgeführt werden. Verwenden Sie als Lock-Objekt die zugehörige Notaufnahme.
    5. AnschließendparkterfüreinegewisseZeitvorderNotaufnahmebevor er diese wieder verlässt.






    6. Das Verlassen der Notaufnahme wird wieder über die Konsole mitgeteilt.
      1. Nach dem Ausfahren soll der RTW mit Hilfe der MethoderemoveRTW() der Klasse Notaufnahme wieder aus der Liste der parkenden RTW entfernt werden.
      2. Die Punkte 5-7 sollen unterbrechungsfrei (Atomar) ausgeführt werden. Verwenden Sie das gleiche Lock-Objekt wie in 4.
        Java:
        package Schritt2;
        
        import java.util.concurrent.ThreadLocalRandom;
        
        public class Rettungswagen extends Thread{
        
        
            private String kennzeichen;
            
            private Notaufnahme zugehoerigeNotaufnahme;
            
            public Rettungswagen(String kennzeichen, Notaufnahme zugehoerigeNotaufnahme){
                this.kennzeichen = kennzeichen;
                this.zugehoerigeNotaufnahme = zugehoerigeNotaufnahme;
                 Thread.currentThread().start();
                
            }
            
            public void Rettungswagen(String kennzeichen, Notaufnahme notaufnahme) {
                
            }
            
            public void run(Notaufnahme zugehoerigeNotaufnahme) {
                
                synchronized(zugehoerigeNotaufnahme) {
                
                System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist eingefahren." + Thread.currentThread());
                
            Notaufnahme.addRTW();
                
                }
                
                try {
                    Thread.sleep(ThreadLocalRandom.current().nextInt());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                synchronized(zugehoerigeNotaufnahme) {
                
                System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist wieder ausgefahren." + Thread.currentThread());
                
                }
            }
            
            public String getKennzeichen() {
                return kennzeichen;
            }
        }

      Und abschließend würdet Ihr mir sehr weiterhelfen, wenn mir jemand erklärt, wie man es hinkriegt, dass jeder Rettungswagen ein anderes Kennzeichen hat? Und wieso ich die runMethode nicht aufrufen kann? (Als Fehler steht: Cannot invoke run() on the array type Rettungswagen[])


      Die Klasse Notfall soll die Anwendung zur Notfallsimulation starten und es ermöglichen verschiedene Szenarien auf Basis verschiedener Anfangskonstellationen darzustellen.
      1. Implementieren Sie die Main-Methode der Klasse Notfall indem Sie hier die konkreten Objekte für die Notaufnahme und die Rettungswagen erzeugen. Die Objekterzeugung der Rettungswagen sollten dynamisch innerhalb einer for- Schleife bis zu der definierten Anzahl an RTW generiert werden.
      2. Spielen Sie exemplarisch folgende Szenarien durch:
        1. Klinik mit einer Notaufnahme und 5 Parkplätzen. Insgesamt sind 10 RTW
        unterwegs, welche nacheinander die Notaufnahme aufsuchen.
        2. Klinik mit einer Notaufnahme und 2 Parkplätzen. Insgesamt sind 10 RTW
        unterwegs, welche nacheinander die Notaufnahme aufsuchen.
        Java:
        package Schritt2;
        public class Notfall {
        
        
            public static void main(String[] args) {
                
                Notaufnahme notaufnahme1 = new Notaufnahme (5);
                
                
                Rettungswagen [] rettungswagen = new Rettungswagen[10];
                
                for ( int i = 0; i <=10; i++ ) {
                    
                    rettungswagen[i] = new Rettungswagen("abc", notaufnahme1);
                            
                        }
              [B]  [/B]rettungswagen.run();
                    }
                
                        
        
                    
                                    
                    }
        Vielen Dank schonmal im Voraus, wenn sich jemand findet, der mir bereit ist zu helfen/die Sachen zu erklären. :)

 
mihe7

mihe7

Top Contributor
ich habe ein paar Schwierigkeiten beim Beenden folgender Aufgabe:
Ein paar? Das ist aber sehr optimistisch formuliert. Tipp: lies Dich nochmal ein und übe - auch außerhalb von Aufgaben. Dir fehlen Grundlagen und wenn ich hier sehe, dass Du schon Aufgaben zu Multithreading bearbeiten sollst, dann wird es allerhöchste Eisenbahn.

Trotzdem mal ein wenig zur Erklärung. Prinzipiell ist es so, dass mehrere Threads (RTW) eine Ressource (Notaufnahme) nutzen wollen. Daher muss der Zugriff auf die Ressource synchronisiert werden.

Implementieren Sie die Methode einfahren(). Stellen Sie sicher, dass immer nur ein RTW zur gleichen Zeit einfahren kann. Sollten beim Einfahren keine Parkplätze sein, so wartet der RTW bis ein Parkplatz frei wird (wait()).

Was kann passieren? Zunächst einmal könnten mehrere Threads die Methode gleichzeitig aufrufen (d. h. mehrere RTW wollen gleichzeitig in die Notaufnahme einfahren). Das lässt sich mit einem Lock-Objekt verhindern. Nehmen wir hierzu ein fiktives Objekt lock an:
Java:
public void einfahren() {
    synchronized(lock) {
        // kritischer Abschnitt
    }
}

Jedes Objekt ist in Java mit einem sog. Monitor verknüpft, der grob gesagt eine Sperre zum wechselseitigen Ausschluss (mutual exclusive lock - kurz: mutex) beschreibt. Durch das Schlüsselwort synchronized wird also eine Sperre für das angegebene Objekt angefordert; es wird versucht, den Monitor zu erhalten. Ist das nicht möglich, weil ein anderer Thread bereits den Monitor besitzt, muss der aufrufende Thread warten (passiert automatisch), bis er die Sperre erhält. Damit ist sichergestellt, dass der kritische Abschnitt zu einer Zeit nur von einem Thread betreten werden kann.

Innerhalb des kritischen Abschnitts soll nun überprüft werden, ob Parkplätze frei sind. So lange keine Parkplätze frei sind, soll gewartet werden. Das Monitorkonzept bietet nun eine Möglichkeit, für ein solches, bedingtes Warten:
Java:
public void einfahren() {
    synchronized(lock) {
        while (getPlaces() == 0) {
            try {
                lock.wait();
            } catch (InterruptedException ex) {
                // TBD
            }
        }
    }
}
Beim Aufruf von wait() passieren zwei interessante Dinge: der aufrufende Thread wird blockiert und in eine Warteschlange eingefügt. Außerdem wird der Monitor des betreffenden Objekts freigegeben - daher ist es erforderlich, dass der Monitor zuvor (per synchronized) erhalten wurde.

Wenn nun drei RTW (=Threads) gleichzeitig in die Notaufnahme einfahren wollen, obwohl der Parkplatz voll ist, zeichnet sich folgendes Bild:
  1. ein RTW fährt ein, betritt also den kritischen Abschnitt. Die beiden anderen RTW müssen warten, bis sie die Sperre erhalten.
  2. es wird festgestellt, dass der Parkplatz voll ist, also wird der RTW blockiert (Warteschlange) und die Sperre freigegeben.
  3. der nächste RTW erhält nun die Sperre und betritt den kritischen Abschnitt. Der verbleibende RTW muss warten, bis er die Sperre erhält
  4. es wird festgestellt, dass der Parkplatz voll ist, also wird der RTW blockiert (Warteschlange) und die Sperre freigegeben.
  5. der letzte RTW erhält die Sperre und betritt den kritischen Abschnitt
  6. es wird festgestellt, dass der Parkplatz voll ist, also wird der RTW blockiert (Warteschlange) und die Sperre freigegeben.
Und jetzt? Jetzt sind alle drei Threads blockiert und warten darauf, wieder aufgeweckt zu werden.

Zur Methode gibt es aber erst noch zwei Dinge zu sagen: erstens verwendet die Methode oben ein while und kein einfaches if, um die Bedingung zu überprüfen. Hintergrund sind sog. "spurious wakeups", das sind Situationen, in denen Threads aus ihrem blockierten Zustand geholt werden, obwohl es dafür keinen offensichtlichen Grund gibt. Es kann also passieren, dass ein wartender Thread aufgeweckt wird, obwohl der Parkplatz noch voll belegt ist und obwohl dies nach der Logik des Codes gar nicht passieren dürfte. Dieser Fall wird durch das while verhindert, weil vor dem Verlassen der Schleife die Bedingung nochmal geprüft wird.

Der zweite Punkt ist die Behandlung der InterruptedException. Ich weiß nicht, ob und, wenn ja, was bei Euch diesbezüglich vorgesehen ist. Wenn das Einfahren unterbrochen wird, dann sollte das der Aufrufer irgendwie mitbekommen, so dass er entsprechend reagieren kann. Das kann ein Rückgabewert sein, das kann eine Exception sein.

OK, kommen wir wieder zurück zu interessanteren Dingen: wann und wie werden die wartenden Threads wieder aufgeweckt?

Tja, irgendwann wird ein RTW, der bereits einen Parkplatz belegt, diesen auch mal wieder verlassen, d. h. ein anderer Thread wird irgendwann mal ausfahren() aufrufen. Dort kann man dann einen wartenden Thread wieder aufwecken:
Java:
public void ausfahren() {
    synchronized(lock) {
        lock.notify();
    }
}
Auch hier gilt, dass notify() nur für Objekte aufgerufen werden kann, wenn der betreffende Thread dessen Monitor besitzt. Daher muss dieser per synchronized vorher angefordert werden.

Das Objekt lock war bislang ein fiktives Objekt, so dass sich abschließend die Frage stellt, was man dafür verwenden soll. Zumindest, was die Methoden einfahren() und ausfahren() betrifft, muss es das selbe(!) Objekt sein. Im einfachsten Fall könnte man this verwenden. Wenn man this verwendet und der synchronized-Block die ganze Methode umfasst, dann kann man sich den Block auch sparen und die Methode als synchronized deklarieren, z. B.
Java:
public synchronized ausfahren() {
    notify(); 
}

Und abschließend würdet Ihr mir sehr weiterhelfen, wenn mir jemand erklärt, wie man es hinkriegt, dass jeder Rettungswagen ein anderes Kennzeichen hat? Und wieso ich die runMethode nicht aufrufen kann? (Als Fehler steht: Cannot invoke run() on the array type Rettungswagen[]

Erste Frage: indem Du jeden Rettungswagen mit seinem Kennzeichen erzeugst.

Bzgl. der zweiten Frage gibt es wieder ein paar Dinge, die falsch sind. Erst einmal besagt der Fehler, dass Du versuchst, die run-Methode auf einem Array auszuführen. Das funktioniert nicht, weil ein Array keine solche Methode besitzt.

Dann ist die Implementierung Deiner run-Methode falsch. Du willst Thread#run() überschreiben und diese Methode hat keinen Parameter. Wirf den Parameter raus, Du hast ja bereits eine Instanzvariable für die betreffende Notaufnahme.

Und zu guter Letzt ruft man Thread#run nicht selbst auf. Man startet den Thread einfach.

Java:
        Rettungswagen [] rettungswagen = new Rettungswagen[10];
        
//        for ( int i = 0; i <=10; i++ ) {  <-- bei einem Array der Länge n gehen die Indizes von 0 bis n-1 und nicht bis n...

        for ( int i = 0; i < rettungswagen.length; i++ ) { 
            rettungswagen[i] = new Rettungswagen(String.format("R-TW %02d", i+1), notaufnahme1);
            rettungswagen[i].start();
        }
 
V

Victoria_

Mitglied
Vielen Dank für die schnelle Antwort!Sie haben mir auf jeden Fall schon sehr weitergeholfen, das mit den Lock-Objekten habe ich jetzt auch besser verstanden :)
Nachdem ich meinen Code abgeändert habe, kommt aber leider nichts auf der Konsole raus...
Soll ich noch etwas abändern/hinzufügen?
Ich muss ja noch die zwei Methoden (addRTW und removeRTW) implementieren, aber ich weiß nicht was ich als Parameter übergeben soll (ja einen Rettungswagen, aber egal was ich hinschreibe, akzeptiert er nicht). Wie kann ich den aktuellen Rettungswagen als Parameter übergeben?

Code:
package Schritt2;
import java.util.ArrayList;

public class Notaufnahme {

    private int anzahlPlaetze;
    
    private ArrayList<Rettungswagen> parkendeRTWList;
    
    public Notaufnahme(int anzahlPlaetze, ArrayList<Rettungswagen> parkendeRTWList) {
        this.anzahlPlaetze = anzahlPlaetze;
        this.parkendeRTWList = parkendeRTWList;
        
        if (anzahlPlaetze == 0) {
            throw new IllegalArgumentException("Es muss mindestens 1 Platz existieren");
        }
    }
    
    public Notaufnahme(int numberplaces) {
        
    }
    
    public synchronized void einfahren() {
        
    
        while(getPlaces() == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public synchronized void ausfahren() {
        notify();

    }
    
    public void addRTW(Rettungswagen rtw) {
        
        parkendeRTWList.add(rtw);
        
    }
    
    public void removeRTW(Rettungswagen rtw) {
        
        parkendeRTWList.remove(rtw);   
        
    }

    public int getPlaces() {
        return anzahlPlaetze;
    }
}

Code:
package Schritt2;

import java.util.concurrent.ThreadLocalRandom;

public class Rettungswagen extends Thread{


    private String kennzeichen;
    
    private Notaufnahme zugehoerigeNotaufnahme;
    
    public Rettungswagen(String kennzeichen, Notaufnahme zugehoerigeNotaufnahme) throws InterruptedException{
        this.kennzeichen = kennzeichen;
        this.zugehoerigeNotaufnahme = zugehoerigeNotaufnahme;
        Thread.currentThread().run();
        
    }
    
    public void Rettungswagen(String kennzeichen, Notaufnahme notaufnahme) {
        
    }
    
    public void run(Notaufnahme zugehoerigeNotaufnahme) {
        
        synchronized(zugehoerigeNotaufnahme) {
        
        System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist eingefahren." );
        
        
        }
        
        
        try {
            Thread.sleep(ThreadLocalRandom.current().nextInt());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        synchronized(zugehoerigeNotaufnahme) {
        
        System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist wieder ausgefahren." );
        
        }
    }
    
    public String getKennzeichen() {
        return kennzeichen;
    }
}

Code:
package Schritt2;
public class Notfall {



    public static void main(String[] args)  {
        
        Notaufnahme notaufnahme1 = new Notaufnahme (5);
        
        Rettungswagen [] rettungswagen = new Rettungswagen[10];
        
        for ( int i = 0; i <rettungswagen.length; i++ ) {
              
            try {
                rettungswagen[i] = new Rettungswagen(String.format("R-TW %02d", i+1), notaufnahme1);
                  
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                  
            }
              
            rettungswagen[i].start();
          

                }
          
            }
        
                

            
                            
            }
 
mihe7

mihe7

Top Contributor
Sie haben mir auf jeden Fall schon sehr weitergeholfen
Das ist schön, aber wir Duzen uns hier :)

Soll ich noch etwas abändern/hinzufügen?
Du sollst vor allem nicht run selbst aufrufen:
Thread.currentThread().run();
Weg damit.

run() ist eine ganz normale Methode. Wenn Du diese selbst aufrufst, wird die im aktuellen Thread ausgeführt. Das ist nicht, was Du willst. Du willst einen neuen Thread starten.

Ich muss ja noch die zwei Methoden (addRTW und removeRTW) implementieren
Du hast schon eine Implementierung. Allerdings musst Du dort noch sicherstellen, dass die Liste nicht von mehreren Threads gleichzeitig verändert wird.

Wie kann ich den aktuellen Rettungswagen als Parameter übergeben?
this ist die Referenz auf das "aktuelle" Objekt. Wenn sich ein Rettungswagen also selbst per addRTW hinzufügen soll: addRTW(this);
 
V

Victoria_

Mitglied
Das ist schön, aber wir Duzen uns hier :)
Ok :D
his ist die Referenz auf das "aktuelle" Objekt. Wenn sich ein Rettungswagen also selbst per addRTW hinzufügen soll: addRTW(this);

Wenn ich jetzt in der run-Methode versuche die addRTW Methode aufzurufen, bekomme ich einen Fehler, dass ich die Methode in der Klasse Notaufnahme static machen soll... in dem UML-Diagramm der Aufgabe ist davon aber nicht die Rede:rolleyes:
Danke nochmal für deine Mühe und Hilfe!

Code:
 public void run(Notaufnahme zugehoerigeNotaufnahme) {
        
        synchronized(zugehoerigeNotaufnahme) {
        
        System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist eingefahren." );
        
        Notaufnahme.addRTW(this);
        }
        ....
 
mihe7

mihe7

Top Contributor
bekomme ich einen Fehler, dass ich die Methode in der Klasse Notaufnahme static machen soll...
Merke: static ist fast immer falsch.

Notaufnahme.addRTW(this);
Notaufnahme ist die Klasse, Du musst schon das Objekt verwenden:
Java:
public void run() { // kein Parameter!
    synchronized(zugehoerigeNotaufnahme) {        
        System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist eingefahren." );
        zugehoerigeNotaufnahme.addRTW(this);
    }
}
 
V

Victoria_

Mitglied
Meine letzte Frage, dann höre ich auf dich zu belästigen..
Wenn ich jetzt die main-Methode laufen lasse, werden nur die RTW's auf der Konsole erzeugt, welche eingefahren sind.
Kannst du mir einen Tipp geben, woran das liegt, dass überhaupt keine RTW's ausfahren? :rolleyes:
Zudem bekomme ich bei jedem Thread eine NullpointerException bei der addRTW Methode in der Klasse Rettungswagen sowie Notaufnahme..
 
mihe7

mihe7

Top Contributor
Kannst du mir einen Tipp geben, woran das liegt, dass überhaupt keine RTW's ausfahren?
Ich kenne Deinen aktuellen Code nicht, aber bei dem Codebeispiel aus Kommentar #6 fehlt natürlich die Hälfte.

Zudem bekomme ich bei jedem Thread eine NullpointerException bei der addRTW Methode in der Klasse Rettungswagen sowie Notaufnahme..
Das kann ebenfalls eine Ursache sein.

Stell mal den aktuellen Stand Deines Codes nochmal ein, dann kann man mehr dazu sagen.
 
V

Victoria_

Mitglied
Code:
package Schritt2;
import java.util.ArrayList;

public class Notaufnahme {

    private int anzahlPlaetze;
    
    private ArrayList<Rettungswagen> parkendeRTWList;
    
    public Notaufnahme(int anzahlPlaetze, ArrayList<Rettungswagen> parkendeRTWList) {
        this.anzahlPlaetze = anzahlPlaetze;
        this.parkendeRTWList = parkendeRTWList;
        
        if (anzahlPlaetze == 0) {
            throw new IllegalArgumentException("Es muss mindestens 1 Platz existieren");
        }
    }
    
    public Notaufnahme(int numberplaces) {
        
    }
    
    public synchronized void einfahren() {
        
    
        while(getPlaces() == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public synchronized void ausfahren() {
        notify();

    }
    
    public void addRTW(Rettungswagen rtw) {
        
        parkendeRTWList.add(rtw);
        
    }
    
    public void removeRTW(Rettungswagen rtw) {
        
        parkendeRTWList.remove(rtw);   
        
    }

    public int getPlaces() {
        return anzahlPlaetze;
    }
}

Code:
package Schritt2;

import java.util.concurrent.ThreadLocalRandom;

public class Rettungswagen extends Thread{


    private String kennzeichen;
    
    private Notaufnahme zugehoerigeNotaufnahme;
    
    public Rettungswagen(String kennzeichen, Notaufnahme zugehoerigeNotaufnahme){
        this.kennzeichen = kennzeichen;
        this.zugehoerigeNotaufnahme = zugehoerigeNotaufnahme;
    
        
    }
    
    public void Rettungswagen(String kennzeichen, Notaufnahme notaufnahme) {
        
    }
    
    public void run() {
        
        synchronized(zugehoerigeNotaufnahme) {
        
        System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist eingefahren." );
        
        zugehoerigeNotaufnahme.addRTW(this);
        }
        
        
        try {
            Thread.sleep(ThreadLocalRandom.current().nextInt());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        synchronized(zugehoerigeNotaufnahme) {
        
        System.out.println("RTW mit dem Kennzeichen: " + kennzeichen + " ist wieder ausgefahren." );
        
        zugehoerigeNotaufnahme.removeRTW(this);
        
        }
    }
    
    public String getKennzeichen() {
        return kennzeichen;
    }
}

Code:
package Schritt2;
public class Notfall {


    public static void main(String[] args)  {
        
        Notaufnahme notaufnahme1 = new Notaufnahme (5, null);
        
        Rettungswagen [] rettungswagen = new Rettungswagen[10];
        
        
        for ( int i = 0; i <rettungswagen.length; i++ ) {
              
            rettungswagen[i] = new Rettungswagen(String.format("R-TW %02d", i+1), notaufnahme1);
              
            rettungswagen[i].start();
        
                }
          
            }
                            
            }
 
mihe7

mihe7

Top Contributor
Du gibst ja explizit null für die Liste der parkenden RTW des Konstruktors von Notaufnahme an:
Java:
        Notaufnahme notaufnahme1 = new Notaufnahme (5, null);
Dann musst Du Dich nicht wundern, wenn beim Versuch, zu dieser "Liste" etwas hinzuzufügen, eine NullPointerException geworfen wird.

Dein Warten ist auch schlecht. Gib nextInt() noch eine Zahl mit (maximale Millisekunden), also z. B.
Java:
            Thread.sleep(ThreadLocalRandom.current().nextInt(2000));
um höchstens 2 Sekunden zu warten.

Außerdem fehlen die Aufrufe für das einfahren() und das ausfahren() und getPlaces() liefert aktuell nicht die noch verbleibenden Parkplätze sondern alle.
 
V

Victoria_

Mitglied
Du gibst ja explizit null für die Liste der parkenden RTW des Konstruktors von Notaufnahme an:
Ich dachte am Anfang ist ja die Liste noch leer, weil es keine wartenden RTW's gibt. Die ArrayList ist vom Datentyp Rettungswagen, ich habe sämtliche Sachen versucht da reinzuschreiben( rettungswagen, rtw, ..) aber immer bekomme ich eine Fehler. Ich komme einfach nicht drauf was man dem Konstruktor als Parameter übergeben soll..
Dein Warten ist auch schlecht. Gib nextInt() noch eine Zahl mit
Das Warten ist so gewollt( war in einer anderen Teilaufgabe so gefordert)
 
mihe7

mihe7

Top Contributor
Das Warten ist so gewollt( war in einer anderen Teilaufgabe so gefordert)
nextInt() ohne Parameter liefert eine zufällige Zahl im gesamten Wertebereich von int, also von etwa -2,4 bis +2,4 Mrd. Bei negativen Zahlen bekommst Du eine Exception und wenns dumm läuft, wartest Du 2,4 Mio. Sekunden, also etwa 27 Tage. Ich glaube kaum, dass das so gewollt war :)


Ich dachte am Anfang ist ja die Liste noch leer, weil es keine wartenden RTW's gibt. Die ArrayList ist vom Datentyp Rettungswagen, ich habe sämtliche Sachen versucht da reinzuschreiben( rettungswagen, rtw, ..) aber immer bekomme ich eine Fehler. Ich komme einfach nicht drauf was man dem Konstruktor als Parameter übergeben soll..
Eine leere Liste (new ArrayList<>()). Tatsächlich würde ich den Parameter rausnehmen, sofern er nicht explizit in der Aufgabe gefordert ist, und im Konstruktor einfach eine leere Liste erstellen.

EDIT: null ist keine leere Liste, sondern null ist gar keine Liste.
 
V

Victoria_

Mitglied
Alles klar ich habe es jetzt tatsächlich mit Parameter zum Laufen gebracht und das ohne Exceptions :)
Wie könnte ich denn noch dafür sorgen, dass der selbe RTW nach dem einfahren nicht sofort wieder rausfährt, sondern z.b. erst 3 andere RTW's einfahren und er dann erst rausfährt?
Kann ich dir eigentlich irgend eine Donation oder ähnliches geben? Weil du hast mir sehr weitergeholfen und das ist heutzutage nicht selbstverständlich..
 
mihe7

mihe7

Top Contributor
Wie könnte ich denn noch dafür sorgen, dass der selbe RTW nach dem einfahren nicht sofort wieder rausfährt, sondern z.b. erst 3 andere RTW's einfahren und er dann erst rausfährt?
Das passiert durch das unterschiedliche Warten automatisch. Wenn das bei Dir nicht der Fall ist, stimmt was nicht. Außerdem kannst Du vor dem Einfahren auch nochmal warten, denn in der Aufgabe steht, dass der RTW erst einmal eine Zeit in der Gegend rumfährt, bevor er in die Notaufnahme einfährt ;)

Weil du hast mir sehr weitergeholfen und das ist heutzutage nicht selbstverständlich..
Da kommen mehrere Dinge zusammen:
1. Das ist irgendwo Sinn und Zweck eines Forums, oder? :)
2. Hier kann ich mich mit anderen Problemen beschäftigen als im Job. Gerade Basics gefallen mir, denn die werden zur Routine und ein Wechsel der Perspektive hilft, sich zu verbessern.
3. Man verbessert sein Denken, wenn man anderen etwas erklärt.

Diese Verbesserungen passieren natürlich nicht schlagartig (gut, das ist vermutlich abhängig von den bisherigen Erfahrungen) aber mit der Zeit stellt man Veränderungen fest.

Ich kann nur jedem (auch Dir) raten, mal zu versuchen, eine Frage eines anderen zu beantworten. Wenn man sich unsicher ist, kann man die Antwort vorsichtig oder gar selbst als Frage formulieren. Da lernst Du wesentlich mehr, als wenn Du Dir ein Buch anschaust.

Unabhängig davon: wenn Dir z. B. nicht klar ist, was null ist, dann fehlen elementare Grundlagen. An diesen kommst Du nicht vorbei, die müssen sitzen. Ansonsten wirst Du keine Freude haben, weil Du nicht verstehst, was Du schreibst.
 
M

Meniskusschaden

Top Contributor
Ich kann nur jedem (auch Dir) raten, mal zu versuchen, eine Frage eines anderen zu beantworten. Wenn man sich unsicher ist, kann man die Antwort vorsichtig oder gar selbst als Frage formulieren. Da lernst Du wesentlich mehr, als wenn Du Dir ein Buch anschaust.
Volle Zustimmung. Siehe auch Cunninghams Gesetz. Es schadet deshalb auch überhaupt nichts, wenn man dabei mal etwas Falsches schreibt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
H Probleme beim Erstellen einer txt. Datei Allgemeine Java-Themen 7
S Probleme beim Start von jar Datein Allgemeine Java-Themen 15
S Probleme beim Compilen Allgemeine Java-Themen 8
N Probleme mit Umlauten beim Einlesen Allgemeine Java-Themen 6
P Probleme beim Signieren Allgemeine Java-Themen 2
D Probleme beim schreiben / lesen in TreeMap Allgemeine Java-Themen 9
S Probleme beim Anzeigen des Dateiinhalts Allgemeine Java-Themen 6
O Probleme beim vergleichen von 2 Datumsangaben Allgemeine Java-Themen 2
hdi Probleme beim Rechnen mit BigDecimal Allgemeine Java-Themen 5
V Probleme beim Drucken mehrerer PDF's Allgemeine Java-Themen 17
E Probleme beim Umstieg auf Version 1.6.0_12 Allgemeine Java-Themen 4
J Java Plugin probleme beim Laden? Allgemeine Java-Themen 3
V Probleme beim Lesen mit readObject -> InvalidClassExcepti Allgemeine Java-Themen 3
D Probleme beim Umstellen von iText 1.4.4 auf Version 2.1.2 Allgemeine Java-Themen 5
G Probleme beim Sichern von Properties Allgemeine Java-Themen 2
W Probleme beim Ausführen einer Java Klasse auf Kommandozeile Allgemeine Java-Themen 17
S Probleme beim Einstieg Allgemeine Java-Themen 3
F Probleme beim speichern einer xml datei mit jdom Allgemeine Java-Themen 5
D Probleme beim FAQ (JTextField: Dokumentarten) Allgemeine Java-Themen 5
B probleme beim compilen/decompilen Allgemeine Java-Themen 4
G Probleme beim Mail-Api mit BCC Allgemeine Java-Themen 2
M Probleme beim ausführen meiner Klasse Allgemeine Java-Themen 8
G probleme beim sortieren einer ArrayList Allgemeine Java-Themen 8
G Probleme beim Entzippen Allgemeine Java-Themen 4
G jdk1.5 Probleme beim Installieren unter Win Allgemeine Java-Themen 2
J Probleme mit der CommApi beim ProgrammStart über Konsole Allgemeine Java-Themen 2
P Probleme beim Einlesen einer TXT/CSV-Datei aus einem JAR Allgemeine Java-Themen 7
C Probleme beim Starten eines Java-Programms Allgemeine Java-Themen 2
E Probleme beim Zugriff auf verschachtelte Vektoren Allgemeine Java-Themen 16
G Probleme beim Verbinden auf einen Notes 5 Server Allgemeine Java-Themen 3
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
R Snake Probleme Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
J Synchronized Probleme Allgemeine Java-Themen 7
J Java Progressbar & Download Probleme Allgemeine Java-Themen 10
S Probleme mit dem filechooser Allgemeine Java-Themen 1
J Comperator Probleme Allgemeine Java-Themen 4
S Probleme mit Webappplikation Allgemeine Java-Themen 5
L Plötzlich Probleme mit der JVM :( Allgemeine Java-Themen 6
S starke performance probleme des forums Allgemeine Java-Themen 10

Ähnliche Java Themen


Oben