# Ampel automatisch umschalten



## Guest1760 (1. Mrz 2010)

Hallo ich wollte ein Projekt erstellen womit man eine Fußgänger ampel in java erstellt. Das ist das was bisher bei mir rausgekommen ist.


```
class FUSSGAENGERAMPEL
{


    enum Zustaende {rot, gelbrot, gruen, gelb, kaputt};
    int positionX;
    int positionY;
    int x =1000;
    
    String ampelphase;
    
    Zustaende zustand;

    LAMPE lampeOben;
    LAMPE lampeMitte;
    LAMPE lampeUnten;
    
    


   FUSSGAENGERAMPEL()  
   
   {
        positionX = 1;
        positionY = 1;
        ampelphase = "rot";
       
        x =1000;
        lampeOben = new LAMPE();
        lampeMitte = new LAMPE();
        lampeUnten = new LAMPE();
        lampeOben.PositionSetzen(1, 1);
        lampeMitte.PositionSetzen(1, 2);
        lampeUnten.PositionSetzen(1, 3);
        lampeOben.FarbeSetzen("rot");
        lampeMitte.FarbeSetzen("schwarz");
        lampeUnten.FarbeSetzen("schwarz");
        
    }
    
            void AmpelAn ()
  {
                     
            zustand = Zustaende. rot;
            lampeOben.FarbeSetzen ("rot");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("schwarz");
            
                    
           
            zustand = Zustaende. gelbrot;
            lampeOben.FarbeSetzen ("rot");
            lampeMitte.FarbeSetzen ("gelb");
            lampeUnten.FarbeSetzen ("schwarz");
        
     
        
            zustand = Zustaende. gelb;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("gelb");
            lampeUnten.FarbeSetzen ("schwarz");
        
   
        
        
            zustand = Zustaende. gruen;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("gruen");
        }
        
        void AmpelAus ()
             
        {
            zustand = Zustaende. kaputt;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("schwarz");
            
        }
            
    }
```

Was ich ändern wollen würde ist, dass ich nach jeweils den Zustaenden. rot, Zustaenden.gelbrot, Zustaenden.gelb, einen art timer einstelle der sagt nach 10 sek schaltet die ampel automatisch von rot nach gelbrot nach grün, nach gelb usw... Geht das?
Wenn ja erklärt mir bitte wie ich das einrichten kann


Danke

Gruß

Christian


----------



## nrg (1. Mrz 2010)

Kannst einen Thread erstellen, der das dann permanent macht:

```
public class Test extends Thread {
	public static void main(String[] args) {
		new Test().start();
	}
	public void run() {
		while (true) {
			try {
				//Ampel auf Grün setzen
				Thread.sleep(10000);
				//Ampel auf Gelb setzen
				Thread.sleep(1000);
				//Ampel auf Rot setzen
				Thread.sleep(10000);
				//Ampel auf Gelbrot setzen
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
```


----------



## Guest1760 (1. Mrz 2010)

Wo muss ich das dann hinkopieren dass es funktioniert?

Liebe Grüße

Christian


----------



## nrg (1. Mrz 2010)

einfach so mit copy paste wird das wohl nichts. würde mir etwas fachliteratur über threads anschauen, um das - wie von dir gewünscht - umzusetzen.


----------



## Guest1760 (1. Mrz 2010)

ah cool es geht danke!!


----------



## Quest1760 (1. Mrz 2010)

Was mach ich nun eigentlich wenn ich machen will dass er auch noch void stop() oder so was hat?


```
public class AMPEL extends Thread {
    public static void main(String[] args) {
        new AMPEL().start();
    }
    
    enum Zustaende {rot, gelbrot, gruen, gelb, kaputt};
    int positionX;
    int positionY;
    int x =1000;
    String ampelphase; 
    Zustaende zustand;
    
    
    LAMPE lampeOben;
    LAMPE lampeMitte;
    LAMPE lampeUnten;
    
    void FUSSGAENGERAMPEL()  
   
   {
        positionX = 1;
        positionY = 1;
        ampelphase = "rot";
       
        x =1000;
        lampeOben = new LAMPE();
        lampeMitte = new LAMPE();
        lampeUnten = new LAMPE();
        lampeOben.PositionSetzen(1, 1);
        lampeMitte.PositionSetzen(1, 2);
        lampeUnten.PositionSetzen(1, 3);
        lampeOben.FarbeSetzen("rot");
        lampeMitte.FarbeSetzen("schwarz");
        lampeUnten.FarbeSetzen("schwarz");
        
    }
   
    
    public void run() {
        while (true) {
            try {
                

            
            {
                
            zustand = Zustaende. gruen;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("gruen");
                
                //Ampel auf Grün setzen
                Thread.sleep(10000);
                
            zustand = Zustaende. gelb;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("gelb");
            lampeUnten.FarbeSetzen ("schwarz");
                
                //Ampel auf Gelb setzen
                Thread.sleep(1000);
                
                zustand = Zustaende. rot;
            lampeOben.FarbeSetzen ("rot");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("schwarz");
            
                //Ampel auf Rot setzen
                Thread.sleep(10000);
                
                 zustand = Zustaende. gelbrot;
            lampeOben.FarbeSetzen ("rot");
            lampeMitte.FarbeSetzen ("gelb");
            lampeUnten.FarbeSetzen ("schwarz");
                
                //Ampel auf Gelbrot setzen
                Thread.sleep(1000);
            }} catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
     public void stop()
     
     {
            zustand = Zustaende. kaputt;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("schwarz");
        } 

}
```

wenn ich das so mache, dann kommt ein fehler:

stop() in AMPEL cannot override stop() in java.lang.Thread; overridden method is final


Wie kann ich das ändern?

LG
Christian


----------



## Ziegenpeter (1. Mrz 2010)

Wie in der Fehlermeldung ja schon zu lesen ist, gibt es in der Klasse Thread die Methode stop(). Daher benenn doch deine stop()-Methode einfach in stoppeAmpel() um. Problem sollte dann gelöst sein.


----------



## nrg (1. Mrz 2010)

naja imho nicht. der thread wird trotzdem weiterlaufen. kurz wird die ampel ausgeschaltet bis eben der zugleich laufende sleep beendet ist und die ampel im thread wieder umschaltet.


----------



## Ziegenpeter (1. Mrz 2010)

Ach ok, ja er will ja auch den Thread stoppen. Du machst also folgendes:


```
public void run() {
        while (!isInterrupted()) {
            try {
                
 
            
            {
                
            zustand = Zustaende. gruen;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("gruen");
                
                //Ampel auf Grün setzen
                Thread.sleep(10000);
                
            zustand = Zustaende. gelb;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("gelb");
            lampeUnten.FarbeSetzen ("schwarz");
                
                //Ampel auf Gelb setzen
                Thread.sleep(1000);
                
                zustand = Zustaende. rot;
            lampeOben.FarbeSetzen ("rot");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("schwarz");
            
                //Ampel auf Rot setzen
                Thread.sleep(10000);
                
                 zustand = Zustaende. gelbrot;
            lampeOben.FarbeSetzen ("rot");
            lampeMitte.FarbeSetzen ("gelb");
            lampeUnten.FarbeSetzen ("schwarz");
                
                //Ampel auf Gelbrot setzen
                Thread.sleep(1000);
            }} catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
     public void stoppeAmpel()
     
     {
            zustand = Zustaende. kaputt;
            lampeOben.FarbeSetzen ("schwarz");
            lampeMitte.FarbeSetzen ("schwarz");
            lampeUnten.FarbeSetzen ("schwarz");
            this.interrupt();
        }
```


----------



## Guest1760 (8. Mrz 2010)

Hallo, wie müsste denn dazu eine funktion stop heißen, da irgendwie Thread.stop() nicht funktioniert.

LG

Christian


----------



## SlaterB (8. Mrz 2010)

was spricht gegen
> public void stoppeAmpel()
aus der vorherigen Antwort?


----------



## eRaaaa (8. Mrz 2010)

kurze Anmerkung noch zu dem Code von nrg/Quest1760/Ziegenpeter und der schon angesprochenen stoppeAmpel-Methode: Das wird so höchster Wahrscheinlichkeit nicht wie gewollt funktionieren! Da der Code innerhalb der run-Methode sich fast ausschließlich im "Schlaf" befindet, wird interrupt wahrscheinlich dann auch aufgerufen, wenn sich der Thread in diesem Zustand befindet....lange Rede kurzer Sinn: im catch-Block (catch (InterruptedException e)) müsste wahrscheinlich noch erneut interrupt() aufgerufen werden!


----------



## Guest1760 (8. Mrz 2010)

Also wenn ich da dann void stoppeAmpel klicke dann kommt ein neues fenster, das sagt:

Fehler

Your Program is already running, and stopped at a breakpoint.
You cannot start another execution while the current one is still active.

Use the debugger Controls to either continue or terminate the current execution first.

Erst wenn ich dannach auf Beenden klicke bricht es vollständig ab.

Kann sein, dass eRaaaa dies gerade genannt hat, jedoch werde ich daraus nicht klar. wie müsste es dann heißen dass der fehler nicht mehr kommt?

Lg
Christian


----------



## SlaterB (8. Mrz 2010)

die Fehlermeldung klingt, als wenn du das Programm im Debugger ausführst

> jedoch werde ich daraus nicht klar. wie müsste es dann heißen dass der fehler nicht mehr kommt?

->

> im catch-Block (catch (InterruptedException e)) müsste wahrscheinlich noch erneut interrupt() aufgerufen werden!


----------



## Guest1760 (8. Mrz 2010)

Wie geht das? wie kann das nocheinmal aufgerufen werden?


----------



## SlaterB (8. Mrz 2010)

wie rufst du es denn das erste Mal auf (Zeile 52 im Posting von Ziegenpeter), einfach die Codezeile kopieren?


----------



## Guest1760 (8. Mrz 2010)

Selbe fehler immer noch, wie kann man denn den Debugger ausschalten? bzw einfach ohne debugger ausführen?


----------



## SlaterB (8. Mrz 2010)

ja 
(aber frag nicht wie, ohne je eine Information gegeben zu haben, wie du dein Programm startest)


----------



## nrg (8. Mrz 2010)

nicht immer auf mir rumhacken . bei meinem post waren wir bei "ich möchte den Zustand permanent wechseln" von einem stop war da noch garnicht die Rede . In Bezug auf Ziegenpeters Post hast du natürlich Recht.

edit: hätte mal F5 drücken sollen. war auf eRa's Post bezogen


----------

