Thread - sleep - interrupt

Status
Nicht offen für weitere Antworten.

Ripei

Mitglied
N Abnd....

Ich bin ein ziemlicher Java-Neuling.
Ich versuche momentan ein Programm zu programmieren wo eine Grafik vom linken zum rechten Bildschirmrand "wandert". Und man steuert einen Punkt. (Manche kennen das Spiel vllt. unter dem Namen Frogger)
Dazu habe ich in ein JPanel einen Thread implementiert.
Prinzipiell läuft das Programm.

Jedoch jedesmal wenn ich den Punkt mit der Tastatur steuere, dann wird mir eine Fehlermeldung angezeigt;

java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)


Logischerweise muss ich den Thread ja auch irgendwann mal schlafen(sleep)en lassen.
Während ich den Punkt mit der Tastatur steuere, muss ich den Thread aber mittels t.interrupt(); unterbrechen, da ich den Punkt sonst nicht steuern kann.
Das Problem liegt jetzt darin, dass ich den Thread auch unterbreche wenn er schlaft. Was ja eigentlich sinnlos ist.

Meine Frage; kann ich während der Thread schläft, eine Boolean true setzen und während diese Boolean true ist, interrupte ich dann einfach nicht.
Oder hat irgendwer einen anderen besseren Lösungsweg?

Danke für eure Antworten.
mfg Ripei
 
G

Guest

Gast
Warum muss der Thread unterbrochen sein um den Punkt zu steuern? Ich kenne mich mit Thread-Programmierung nicht besonders gut aus. Aber der Sinn sollte doch sein, dass die Steuerung in einem Thread läuft und die Grafikberechnung und beider nebenläufi funktioniert. Oder habe ich etwas falsch verstanden?
 

Ripei

Mitglied
Sry.
Ich hab mich vllt. nicht ganz klar ausgedrückt;
Die Steuerung des Punktes läuft nicht in einem Thread, in einem Thread läuft nur das Bild (in meinem Fall ein Auto).
Die Steuerung des Punktes hab ich einfach mit dem Event FormKeyPressed gelöst. Das Problem ist, dass anscheinden der Thread, wenn er einmal läuft, mehr "zu sagen hat" als die Punkt-Steuerung. Deshalb das interrupt, dann steuere ich den Punkt (z.B. posX + 10) und lass den Thread wieder weiterlaufen.
 
G

Guest

Gast
hmm... ich versteh dein Problem.. leider kenn ich mich zuwenig aus um dir helfen zu können.
 

Wildcard

Top Contributor
Während ich den Punkt mit der Tastatur steuere, muss ich den Thread aber mittels t.interrupt(); unterbrechen, da ich den Punkt sonst nicht steuern kann.
Warum?
Du baust da vermutlich etwas sehr seltsames.
Hast du dir die Zeit genommen dich in das Thema einzulesen bevor du anfängst verrückte Dinge zu programmieren? ???:L
 

Ripei

Mitglied
Sagen wir so; ich hab nach verschiedenen Lösungsmöglichkeiten gesucht und nur diese gefunden.
Und dass mein Code bzw. mein Lösungsweg wahrscheinlich nicht wirklich "professionell" ist das ist mir bewusst, aber ich bin wie gesagt noch ein Java-Neuling.
 

Wildcard

Top Contributor
Ich hab schon viele Lösungen gesehen, eine mit interrupt war noch nie dabei.
Entweder du zeigst deinen Code (bitte auf das wesentliche reduziert), oder du gehst bekannte Pfade.
 

Ripei

Mitglied
Ok.. hier ist der Code. Wahrscheinlich werden jetzt mind. 5 Leuten die Augen ausfallen wenn sie ihn sehen, aber wie gesagt, ich bin ein Neuling.

Code:
public void run(){
        while( true){
            try {
                
                posXA1 += 10;
                posXA2 += 20;
                posXA3 += -10;
                posXA4 += -20;
                if(posXA1 >= 655){
                    posXA1 = 0;
                }if(posXA2 >= 655){
                    posXA2 = 0;
                }if(posXA3 <= 0){
                    posXA3 = 655;
                }if(posXA4 <= 0){
                    posXA4 = 655;
                }
                
                koordinatenCheck1(posX, posY, posXA1, posYA1);
                koordinatenCheck2(posX, posY, posXA2, posYA2);
                koordinatenCheck3(posX, posY, posXA3, posYA3);
                koordinatenCheck4(posX, posY, posXA4, posYA4);
                
                t.sleep(100);
                repaint();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }

In paintComponent lasse ich dann einfach die Autos zeichnen.
Code:
private void formKeyPressed(java.awt.event.KeyEvent evt) {                                
        Graphics g = this.getGraphics();
        boolean test = t.isAlive();
        t.interrupt();
        switch(evt.getKeyCode()){
            case KeyEvent.VK_RIGHT:{
                if(posX >=500){
                    posX = posX;
                }else{
                    posX += 10;    // posX = posX + 10;
                }
                
                repaint();
                break;
            }
            case KeyEvent.VK_LEFT:{
                if( posX <= 0){
                    posX = posX;
                }else{
                    posX -= 10;
                }
                repaint();
                break;
            }
            case KeyEvent.VK_UP:{
                if(posY <= 40){
                    int retVal = JOptionPane.showConfirmDialog(null, "Sie haben es geschafft, erneut versuchen?");
                    if( retVal == JOptionPane.YES_OPTION){
                        posX = 300;
                        posY = 370;
                    }if(retVal == JOptionPane.NO_OPTION){
                        System.exit(0);
                    }
                }else{
                    posY -= 10;
                }
                
                repaint();
                break;
            }
            case KeyEvent.VK_DOWN:{
                if(posY >= 370){
                    posY = posY;
                }else{
                    posY += 10;
                }
                
                repaint();
                break;
            }
            
        }
        t.start();

Ok... das ist der Wichtigste Teil des Programms.
Vllt. Versteht ihr jetzt mein Problem. [/code]
 

Ripei

Mitglied
Sry. Ich habe gereade gesehen, dass bei dem 2. Codetext in der 4 Zeile steht:

boolean test = t.isAlive();

Das gehört eigentlich nicht hinein, das war ein Versuch von mir, den ich eigentlich raustun wollte.
 

Ripei

Mitglied
Ich erklär euch mal wie ich das Programm aufgebaut habe;

Zuerst habe ich einfach einen Punkt gezeichnet und probiert ihn zu steuern.
Als ich das realisiert hatte, habe ich einen weitern Punkt gezeichnet. Dieser war mein Thread, er sollte von links nach rechts wandern.
Also ich das auch geschafft hatte, und austeste ob es jetzt funktioniert, lief der Thread so wie er sollte. Jedoch konnte plötzlich meinen Punkt nicht mehr steuern. D.h. während der Thread läuft, hatten die anderen Sachen nichts zu sagen.
Deshalb unterbreche ich den Thread und steuere dann meinen Punkt, anschließend nachdem ich den Punkt gesteuert habe lass ich den Thread mit t.start(); weiterlaufen.
 

Wildcard

Top Contributor
Ripei hat gesagt.:
Also ich das auch geschafft hatte, und austeste ob es jetzt funktioniert, lief der Thread so wie er sollte. Jedoch konnte plötzlich meinen Punkt nicht mehr steuern. D.h. während der Thread läuft, hatten die anderen Sachen nichts zu sagen.
Dann musst du einen Fehler gemacht haben. Threads sind pseudo-parallel.
Ich denke nicht das es sehr sinnvoll ist deinen aktuellen Ansatz weiter zu verfolgen.
 

Ripei

Mitglied
Ich habe es jetzt noch mal ohne Interrupt probiert und ich habe gesehen, dass ich es vorher genau falsch erklärt habe. Weil wenn ich interrupt raustue, dann kann ich den Punkt steuern aber der Thread läuft nicht mehr.
Also genau umgekehrt wie ich vorher gesagt habe.
 

Wildcard

Top Contributor
Das gibt keinen Sinn. Du sagst gerade:
Wenn du einen Thread nicht unterbrichst, läuft er nicht. :autsch:
Ich glaube dein Code ist seriously broken.
Tu's als Erfahrung ab und fang neu an.
 

Ripei

Mitglied
tja... es ist aber so...ich kanns mir auch nicht erklären
hmm... schade...dabei ist es ja im prinzip schon gelaufen und ich wollte nur noch
dieses Problem lösen, dann wäre ich mit dem Programm endgülitig fertig gewesen.
 
R

Ripei.

Gast
ich hab eine Frage:
Weil ich das mit dieser Lösungsvariante doch noch nicht aufgeben will, hab ich mich nochmal ein bisschen in Threads hineingelesen. Ich bin auch auf die Methode Thread.getState() gekommen.
Meine Frage; ich könnte jetzt ja im Prinzip herausfinden, in welchem Status sich der Thread momentan befindet.
Nur wie schreibe ich das als JavaCode? Ich stell mir das so vor; wenn der Thread schläft, dann soll er in einer if schleife den Thread nicht interrupten. Wenn er nicht schläft dann schon.
 

Ripei

Mitglied
prinzipiell müsste das ja irgendwie so gehen...

if(thread.getState() = *** ){

>> hier halt dann der code zum steuern des punktes <<

}else{

thread.interrupt();
>>hier halt dann der code zum steuern des punktes <<
thread.start();

}

ich weiß jetzt nicht was ich oben bei den *** reinschreiben soll.
Da müsste dann halt stehen wenn der Status den er bekommt gleich dem Status sleep ist, dann soll er eben das tun
was in der if schleige steht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Thread.sleep() Java Basics - Anfänger-Themen 5
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
P Threads Thread.sleep() Java Basics - Anfänger-Themen 7
M Fehler bei Thread.sleep() Java Basics - Anfänger-Themen 5
B Thread.sleep() Java Basics - Anfänger-Themen 1
C Thread.sleep ratsam? Java Basics - Anfänger-Themen 6
L Thread.sleep Java Basics - Anfänger-Themen 6
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
T Thread Sleep() Java Basics - Anfänger-Themen 4
J Thread.sleep Java Basics - Anfänger-Themen 7
A Thread.sleep() unterbrechen? Java Basics - Anfänger-Themen 3
S Thread.sleep () - Frage Java Basics - Anfänger-Themen 16
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
S Thread.sleep i.V.m Button.setText() Java Basics - Anfänger-Themen 8
G Schleife mit Thread.sleep pausieren Java Basics - Anfänger-Themen 12
M Thread.sleep(20) dauert 31ms ? Java Basics - Anfänger-Themen 7
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
S Thread.sleep Java Basics - Anfänger-Themen 6
V Alternative zu Thread.sleep() ? Java Basics - Anfänger-Themen 6
S Runtime.exec -> Thread.sleep -> Konflikt Java Basics - Anfänger-Themen 7
A Thread.sleep Java Basics - Anfänger-Themen 9
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben