# x Sekunden warten



## Martin (2. Okt 2004)

Hallo,

wie kann ich in Java eine gewisse Zeit warten?
Hatte mir eigentlich gedacht das es so geht:
   sleep(int msec);
   oder wait(int msec);
aber so klappt es leider nicht. Wie geht das richtig?

Schon mal danke für eure Antworten.


----------



## Beni (2. Okt 2004)

Thread.sleep( ... )

Braucht noch ein try-catch-Block.

Und wenn du was graphisches programmierst: beschäftige dich zuerst mit Multithreading.


----------



## Guest (2. Okt 2004)

Es handelt es sich nicht um ein Multithreting Programm. Ich muss doch erst ein Object vom Typ Thread erzeugen. Da ich schon von JFrame erbe, fällt das erben von Thread weg. Kann ich einfach xxx Thread = new Thread(); benutzen und dann xxx.sleep(1000); schreiben?


----------



## Beni (2. Okt 2004)

Thread.sleep ist eine statische Methode, die kannst du also aufrufen, ohne ein Thread-Objekt erzeugen zu müssen.

Diese sleep-Methode blockiert dann denjenigen Thread, der die Methode aufgerufen hat.

Guck mal in der FAQ nach. Das ist dort vielleicht ein leicht anderes Problem, aber "sleep" wird eingesetzt um eine Schlaufe "abzubremsen".

Und wenn du einfach so mal "sleep" aufrufst, _ohne_ Multithreading zu betreiben, wird einfach dein ganzes Prog stehen (inkl. der graphischen Oberfläche).


----------



## Martin (2. Okt 2004)

Habe jetzt einfach mal an der passenden stelle Thread.sleep(1000); geschrieben. Beim Compilieren kommt folgende Fehlermeldung (benutze NetBeans, aber dass sollte ja egal sein):

init:
deps-jar:
Compiling 1 source file to /home/martin/Timer/build/classes
/home/martin/Timer/src/timer/TimerGUI.java:108: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
Thread.sleep(1000); 
1 error
BUILD FAILED (total time: 0 seconds)


----------



## Kaan (2. Okt 2004)

Versuch mal das hier:


```
try{
     Thread.sleep(1000);
}catch(InterruptedException e){}
```


----------



## Martin (2. Okt 2004)

OK, danke das klappt eigentlich soweit. Aber doch nicht ganz so wie ich es mir vorgestellt habe:
Ich versuche einfach nen Timer zu schreiben der von einer bestimmten Zeit runterzält. Volgenden ansatz habe ich. Das Problem was jetzt auftaucht, ist dass die zwischenschritte nicht angezeigt werden. Das Ende wird richtig angezeigt und die regrusionsschleife verlassen aber eigentlich solle noch die zwischenschritte angezeigt werden, aber befor das geschied greift wahrscheinlich schon die sleep anweisung. Was kann ich da machen (auser multithreading)?


```
private void StartStopBtnActionPerformed(java.awt.event.ActionEvent evt) {
AbgelaufenLab.setText("0");
abgelaufenVar = 0;
RestLab.setText(TimeTxt.getText());
restVar = Integer.parseInt(RestLab.getText());
try{
     Thread.sleep(1000);
}catch(InterruptedException e){} 
Timer();
    }
    
    private int Timer()
    {
        abgelaufenVar++;
        restVar--;
        AbgelaufenLab.setText(""+abgelaufenVar);
        RestLab.setText(""+restVar); 
        if (restVar==0){return 0;}
        
        try{
            Thread.sleep(1000);
        }catch(InterruptedException e){} 
        Timer();
        return 1;
    }
```


----------



## bygones (2. Okt 2004)

rekursion heißt das


----------



## Martin (3. Okt 2004)

Danke, jetzt weiss ich wie es richtig geschrieben wird  aber das Prog läuft immer noch nicht richtig. Kann mir den keiner nen tipp geben?


----------



## bygones (3. Okt 2004)

kann es leider nicht ausprobieren - aber als Tipp würde ich dir die Tiimer Klasse ans Herz legen...

Swing ist nicht Thread-safe - daran könnte es liegen....


----------



## Martin (3. Okt 2004)

Danke, wusste gar nicht das es in Java nen Timer gibt. So wollte ich das auch eigentlich machen. Hatte aber nichts passendes gefunden und deswegen das mit dem sleep versucht


----------



## Stefan1200 (4. Okt 2004)

Martin hat gesagt.:
			
		

> Danke, wusste gar nicht das es in Java nen Timer gibt. So wollte ich das auch eigentlich machen. Hatte aber nichts passendes gefunden und deswegen das mit dem sleep versucht



Es gibt sogar zwei Timer in Java.

javax.swing.Timer
java.util.Timer

Der javax.swing.Timer ist etwas einfacher zu nutzen, aber auch ungenauer und eher für GUI Sachen zu gebrauchen, oder bei Dingen, wo es nicht auf Millisekunden ankommt. Einfach mal in die API Doku schauen, wie man die nutzt.


----------



## Martin (5. Okt 2004)

Danke für den Tip mit dem Timer. Habe mich für den swing Timer entschieden. Bei dem Prog muss es nicht so genau sein. Habe aber jetzt noch ne frage. Der Timer zählt in meinem Prog eine Variable runter. Wenn die bei 0 angekommen ist soll was auf der GUI angezeigt werden. Das war noch kein Problem, habe einfach ein Label genommen was visible gesetzt wird. Aber zusätzlich soll noch ein Ton ausgegeben werden. Entweder über den PC-Speaker nen einfaches beep (aber dazu habe ich leider gar nichts in der Java-doc gefunden) oder eine Datei über die Soundkarte (egal ob MP3 oder wav oder sonst was). Für das zweite habe ich gefunden dass ich da was mit javax.sound.sampled machen muss. Aber das habe ich alles nicht so ganz verstanden. Ausserdem würde mir die variante über den PC-Speaker besser gefallen, da man diesen nicht so einfach aus machen kann. Ist das in Java überhaubt realisierbar und hat jemand nen Tipp wie ich das angehen muss?


----------



## Illuvatar (5. Okt 2004)

Entweder
Applet.newAudioClip (URL).play
oder
JMF (Java Media Framework, Download unter http://java.sun.com, Tutorial in den FAQ)
oder
Window#getToolkit().beep()


----------

