// Solange true ist läuft der Thread weiterwhile(true){
t +=0.02;//System.out.println(Schweif);if(Schweif==2){comet();}center(mittelP);// Neuzeichnen des Appletsrepaint();try{// Stoppen des Threads für in Klammern angegebene MillisekundenThread.sleep (20);}catch(InterruptedException ex){// do nothing}// Zurücksetzen der ThreadPriority auf MaximalwertThread.currentThread().setPriority(Thread.MAX_PRIORITY);if(th.interrupted()){break;}}
und wenn ich ganz lange auf f bleibe, und es also seehr viele mal keypressed auslöst, dann bricht der thread ab, doch eigentlich will ich, das wenn man ein mal auf f drückt das gleich der thread abbricht.
Üblicherweise setzt man beim Tastendruck ein flag um...
Code:
private volatile running = true;
// Im Thread:
while (running) { ... }
// Beim Tastendruck:
running = false;
Interrupt ist so brutal Das bewirkt, dass der Thread unterbrochen wird, wenn er in irgendeinem wait/sleep hängt - und zwar mit einer InterruptedException, die man nicht einfach verschlucken sollte:
Code:
try
{
Thread.sleep(20);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
break; // oder return oder was auch immer...
}
ok vielen dank, ob diese methode so sauber ist weeiss ich ja nicht, und warum meine andere methode nicht funktioniert weiss ich auch noch nicht, doch was muss ich machen wenn ich es jetzt wieder starten will?
Java:
if(event.getKeyChar()=='s'){
th.start();}
das habe ich wieder im KeyPressed reingeschrieben.
doch wenn ich dann auf s klicken, startet es nicht wieder, sondern gibt mir diese fehlermeldung aus:
Exception in thread "AWT-EventQueue-1" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:595)
at Thread1_1.keyPressed(Thread1.java:165)
at java.awt.Component.processKeyEvent(Component.java:6221)
at java.awt.Component.processEvent(Component.java:6040)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.ja
va:1848)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboard
FocusManager.java:704)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeybo
ardFocusManager.java:969)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeybo
ardFocusManager.java:841)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFoc
usManager.java:668)
at java.awt.Component.dispatchEventImpl(Component.java:4502)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Wenn der Thread einmal terminiert wurde, kann er nicht erneut gestartet werden! Was ginge wäre, wenn du so etwas wie th = new Thread(....); schreibst, also eine neue Instanz erstellst und dann start() aufrufst. Oder aber du terminierst den alten Thread gar nicht sondern legst ihn schlafen und weckst ihn dann wieder auf !