# Programm nach ablauf eines Timers beenden



## RAPTIK (27. Mai 2011)

Hi ich habe ein Programm geschrieben, ein Spiel, das FarmWorld oder Farmarama ähnelt.
Ich will jetzt dass das Programm startet und man 30 Sekunden zeit hat um Punkte zu sammeln, wenn die Zeit abgelaufen ist, soll das Programm beendet werden und die erreichte Punktzahl angezeigt werden.

Ich hab imr die Klasse Timer durchgelesen, aber habe es nur geschafft, dass nach je 3 Sekunden das Programm erneut ausgeführt wird 

bitte um Hilfe


----------



## Crian (27. Mai 2011)

Dann zeig doch mal den Code dazu. Außerdem meine ich, hier heute schon eine ähnliche Frage gelesen zu haben.

Schau mal hier: http://www.java-forum.org/java-basi...blaufen-lassen-ablauf-beenden.html#post766680


----------



## RAPTIK (27. Mai 2011)

ja das Thema habe ich auch gesehen und habe es dann auch so probiert aber es kommt eben wie beschrieben, dass es das Programm wieder ausführt...auch wenn ich es leicht umgeschrieben habe.


```
/**
 * 
 */
package farm;

import de.unifreiburg.twodeedoo.world.WorldApplication;

/**
 * @author KIZETTER
 *
 */
public class Start 
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		int i = 10;
		while (i != 0) 
		{
			i--;
			try 
			{
				WorldApplication.runWorld(new Farmarama());
				Thread.sleep(3000);
			} 
			catch (InterruptedException e) 
			{
				System.out.println("unbekannter Fehler!");
			}
		}
		System.out.println("Zeit ist um!");
		
	}

}
```


----------



## Michael... (27. Mai 2011)

Es ist ja sicherlich nicht der Sinn alle 3 Sekunden ein neues Farmarama zu erzeugen.
==> Farmarama erzeugen neuen Thread erstellen und 30 Sekunden warten lassen (sofern kein Counter mitlaufen soll) nach dem Warten den Thread das Farmarama oder was auch immer beenden lassen.


----------



## RAPTIK (27. Mai 2011)

ja ok klingt sehr schlüssig

jetzt brauch ich nur noch die passenden Methoden
Zwischenfragen, brauch ich die while-Schleife eigentlich? Reicht ja auch einfach die wait()-Methode oder nicht?


```
/**
 * 
 */
package farm;

import javax.management.timer.Timer;

import de.unifreiburg.twodeedoo.world.WorldApplication;

/**
 * @author KIZETTER
 *
 */
public class Start 
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		int timer = 10;
		while (timer != 0) 
		{
			
			WorldApplication.runWorld(new Farmarama());
			
			Thread t = new Thread();
			try {
				t.wait(5000);
			} 
			catch (InterruptedException e) 
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			t.interrupt();
			timer--;
		 
			
		}
		System.out.println("Zeit ist um!");
		
	}

}
```


----------



## Michael... (27. Mai 2011)

Hab mir den Code vorher garnicht angeschaut, der macht so keinen Sinn.
Hier mal ein Pseudocode. Wobei ich das - wenn's vernünftig werden soll - noch ein bisschen anders machen würde, sollte aber den Zweck erfüllen.


```
erzeugeSpiel();
zeigeSpielFlaecheAn();
new Thread(new Runnable() {
    public void run() {
        Thread.wait(30000);
        deaktiviereSpielFlaeche():
    }
}).start();
```

Man könnte jetzt das Warteintervall auch noch unterteilen, wenn man z.B. einen Countdown anzeigen will. Ansonsten reicht ein einziges wait(...) ohne Schleife.


----------



## RAPTIK (27. Mai 2011)

Michael... hat gesagt.:


> Hab mir den Code vorher garnicht angeschaut, der macht so keinen Sinn.
> Hier mal ein Pseudocode. Wobei ich das - wenn's vernünftig werden soll - noch ein bisschen anders machen würde, sollte aber den Zweck erfüllen.
> 
> 
> ...



das 

```
erzeugeSpiel();
zeigeSpielFlaecheAn();
```
kann ich ja durch

```
WorldApplication.runWorld(new Farmarama());
```
ersetzen richtig? Welches ja das Spiel erzeugt und starten lässt

aber welche methode beendet das spiel?
System.exit()?


----------



## Michael... (27. Mai 2011)

RAPTIK hat gesagt.:


> aber welche methode beendet das spiel?
> System.exit()?


Ich keine das Spiel bzw. dessen Code ja nicht ;-) System.exit(...) beendet die JVM, das ist sicherlich nicht gewollt. Es sollen ja nur die Benutzeraktionen unterbunden oder auf eine andere Ansicht gewechselt werden.
Das muss in einer Methode implementiert werden, die man dann nach dem wait(...) im Thread aufrufen kann.

Dazu ist es aber sicherlich notwendig eine Referenz auf das Spielobjekt zu halten

```
final Farmarama spielObjekt = new Farmarama();
WorldApplication.runWorld(spielObjekt);
...
    Thread.wait(30000);
    spielObjekt.beendeSpiel();
```


----------



## RAPTIK (28. Mai 2011)

also das t.wait(30000); funktioniert nicht. die methode lässt den laufenden thread ja warten, und wartet auf einen anderen thread, der die notify() methode ausführt, das will ich ja nicht.
ich will dass das Programm 30 Sekunden läuft und dann beendet wird. mit der Konsolen ausgabe "zeit um"
es muss doch eine klasse geben, die schon eine methode integriert hat, die einfach eine zeit runterlaufen lässt?


----------



## Michael... (28. Mai 2011)

Sorry, wait(...) ist hier natürlich völlig fehl am Platz. Thread.sleep(...) so wie in Deinem ersten Code Posting ist hier notwendig. Das muss natürlich in einem separaten Thread aufgerufen werden.

Hier mal eine Demo dazu:

```
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountDownDemo extends JFrame {
	private JLabel label;
	private JButton button;
	private int count;

	public CountDownDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(0, 0, 200, 100);
		this.setLocationRelativeTo(null);
		label = new JLabel("Clicks counted: 0", JLabel.CENTER);
		button = new JButton();
		this.getContentPane().add(label, BorderLayout.NORTH);
		this.getContentPane().add(button, BorderLayout.SOUTH);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				label.setText("Clicks counted: " +  ++count);
			}
		});

		new Thread(new Runnable() {
			public void run() {
				startGame();
				for (int i=0; i<10; i++) {
					button.setText((10-i) + " sec remaining");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				stopGame();
			}
		}).start();
	}
	
	private void stopGame() {
		button.setEnabled(false);
		button.setText("Game Over");
	}
	
	private void startGame() {
		try {
			count = 0;
			SwingUtilities.invokeAndWait(new Runnable() {
				public void run() {
					setVisible(true);
				}
			});
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new CountDownDemo();
	}
}
```


----------



## RAPTIK (29. Mai 2011)

Ok danke dir werde mal schauen, was ich damit anfangen kann.
Andere Frage, ist es richtig definiert, wenn ich sage, dass ein Thread in Java, dasselbe ist wie in der Technischen Informatik, nämlich ein Prozess, der von anderen Prozessen unterbrochen werden kann?


----------

