# Thread.sleep() unterbrechen?



## Asga (6. Mai 2012)

Hallo! 

Ich möchte einen simplen Reaktionstest programmieren. Dazu benutze ich einen Thread, der mit einem Random-Generator alle 1,5 Sekunden (thread.sleep()) ein zufälliges Bild auf dem Bildschirm ausgibt. So weit so gut, das Ganze funktioniert auch. Weiterhin soll die Ausgangsdauer der Darstellung pro Symbol bei *Nichtreaktion* des Benutzers wie schon gesagt 1,5 Sekunden betragen. 

Für jeden *richtigen Befehl* des Benutzers (Key-Event) soll die Darstellungsdauer um 0,1 Sekunden verringert werden. Bei einer *falschen Eingabe * soll die Dauer wieder auf 1,5 Sekunden gesetzt werden. An sich funktioniert das auch ganz gut. 

Mein Problem ist jetzt nur: Wenn der Benutzer einen Tastatur-Befehl abgibt, egal ob richtig oder falsch, sollte sofort das nächste Symbol angezeigt werden. Das heißt ich würde gerne bei einem Key-Event die Methode thread.sleep() irgendwie unterbrechen und wieder in den Kopf der while-Schleife springen.

Ich habe schon alles mögliche durchprobiert, unter anderem die stop()-Methode, die interrupt()-Methode und andere, aber irgendwie finde ich nichts was mein Problem lösen könnte, bzw. nichts was den Thread nicht gleich komplett zerstört.


```
public void start()
	{
		thread = new Thread(this);
		thread.start();
	}
	
	public void run()
	{
		for(int i = 3; i >= 1; i--)
		{
			System.out.println("Start in: " + i);
			try
			{
				thread.sleep(1000);
			}
			catch(InterruptedException e)
			{
                                System.out.println("Error: " + e);
			}
			
		}
		long start = System.currentTimeMillis();
		Random randomGenerator = new Random();
		threadzeit = 1500;
		festgelegteZeit = 12000;

		while ((System.currentTimeMillis() - start) < festgelegteZeit)
		{
			int zufallsZahl = randomGenerator.nextInt(4);
			if (zufallsZahl == 0)
			{
				bilder.setIcon(getImage("1.jpg"));
				fenster.repaint();
				summeSymbole++;
				symbol = "1";
			}
			if (zufallsZahl == 1)
			{
				bilder.setIcon(getImage("2.jpg"));
				fenster.repaint();
				summeSymbole++;
				symbol = "2";
			}
			if (zufallsZahl == 2)
			{
				bilder.setIcon(getImage("3.jpg"));
				fenster.repaint();
				summeSymbole++;
				symbol = "3";
			}
			if (zufallsZahl == 3)
			{
				bilder.setIcon(getImage("4.jpg"));
				fenster.repaint();
				summeSymbole++;
				symbol = "4";
			}
			try
			{
				thread.sleep(threadzeit);
			} catch (InterruptedException e)
			{
				System.out.println("Error: " + e);
			}
		}

	}


	public void keyPressed(KeyEvent e)
	{
                String s = ""+ e.getKeyChar();
		if (s.equals(symbol))
		{
			symbolRichtig++;
			if(threadzeit > 500)
			{
				threadzeit = threadzeit - 100;

			}
		}
		else
		{
			symbolFalsch++;
			threadzeit = 1500;
		}

	}
```


----------



## Fab1 (6. Mai 2012)

Schau dir mal die Thematik in Galileo Computing :: Java ist auch eine Insel – 14.3 Thread-Eigenschaften und -Zustände an.

Ganz nett erklärt, wie ich finde.


----------



## Asga (7. Mai 2012)

Ich habe jetzt einfach die sleep Methode mit thread.interrupt() unterbrochen. Wenn interrupt() aufgerufen wird, schmeißt das System eine InterruptedException. Diese wird dann mit catch aufgefangen und ich arbeite im catch-block weiter. 

Bestimmt keine schöne Lösung, aber es funktiniert so wie ich es mir vorstelle ^^


----------



## Lumaraf (7. Mai 2012)

Asga hat gesagt.:


> Ich habe jetzt einfach die sleep Methode mit thread.interrupt() unterbrochen. Wenn interrupt() aufgerufen wird, schmeißt das System eine InterruptedException. Diese wird dann mit catch aufgefangen und ich arbeite im catch-block weiter.
> 
> Bestimmt keine schöne Lösung, aber es funktiniert so wie ich es mir vorstelle ^^



Besser wäre es meiner Meinung nach in diesem Fall mit wait+notify zu arbeiten. Speziell die Methode Object#wait(long) dürfte für dich interessant sein.

Galileo Computing :: Java ist auch eine Insel – 14.6 Synchronisation über Warten und Benachrichtigen


----------

