Laufender Thread | Boolean ändern

fLooojava

Bekanntes Mitglied
Hi,

ich möchte gerne eine Kugel nach einem Tastendruck von oben nach unten fallen lassen.

Beispielcode:
Java:
import java.awt.Color;
import java.awt.Graphics;


class Raft extends JComponent implements Runnable {

	private int xBall=350;
	private int yBall=70;
	private boolean pressed=false;

  public void paint(Graphics g) {
	  g.setColor(Color.GRAY);
          g.fillOval(xBall,yBall, 21, 21);
  }

  public void start () {
	  Thread th = new Thread (this);
	    th.start();
	   }

  public void run () {
	    while (true) {
	    	
	    	/*
	    	 * Balls
	    	 */
	    	if(pressed){
	    		if(yBall<=584.5){
	    		yBall++;
	    		} else System.out.println("checkResult();");
	    		  }
	    	
	      repaint();
	      try {
	          Thread.sleep(10);
	         } catch (InterruptedException e) { }
	    
	    }}
  
  
}

Weiters befindet sich hier in diesem Codeabschnitt auch noch ein Stab, welcher von links nach rechts wandert. ( übersichtshalber habe ich ihn mal rausgenommen ).

Wie ich einen Keylistener implementiere auf den kompletten Frame ist mir bereits bekannt, auch wie ich anschließend den boolean pressed auf true setze, jedoch habe ich Schwierigkeiten mit dem Thread, denn dieser läuft ja bereits und der Boolean war zu Beginn false, somit ist es mir nicht möglich mein gewünschtes Vorhaben zu realisieren.

Was für Möglichkeiten gibt es denn, dass die Änderung der Variable pressed auch Einfluss auf den Ablauf innerhalb des Threads während er läuft hat? Bestimmt sehr logisch, jedoch habe ich damit noch keine Erfahrung gemacht.

Meine Überlegung wäre sowohl für den Stab als auch für die Kugel einen separaten Thread zu erstellen und dann jeweils den Thread der Kugel stoppen/starten....

Gruß
 

CptSocket

Aktives Mitglied
Hallo

Hast du dir das Keyword volatile schonmal angeschaut?
Damit definierst du, dass eine Variable jederzeit den Wert ändern kann => wenn du pressed mit volatile kennzeichnest, sollte im Thread auf eine Änderung reagiert werden können.


Freundliche Grüsse
CptSocket
 

fLooojava

Bekanntes Mitglied
Servus,

nein, noch nie gehört. :lol:

Ich werde es mal testen und mich bei weiteren Problemen nochmals melden, vielen Dank vorerst!

Gruß
 

Joose

Top Contributor
Hast du dir das Keyword volatile schonmal angeschaut?
Damit definierst du, dass eine Variable jederzeit den Wert ändern kann => wenn du pressed mit volatile kennzeichnest, sollte im Thread auf eine Änderung reagiert werden können.

Vollständigkeitshalber: Man muss die Variable nicht mit "volatile" kennzeichnen, und trotzdem reagiert der Thread auf Änderungen!
Aber man sollte sie kennzeichnen ;) damit man als Programmierer schnell sieht: AHA, diese Variable wird von mehreren Threads geändert!

....., jedoch habe ich Schwierigkeiten mit dem Thread, denn dieser läuft ja bereits und der Boolean war zu Beginn false, somit ist es mir nicht möglich mein gewünschtes Vorhaben zu realisieren.

Dann musst du dir überlegen ob man nicht vielleicht die Bedingung erweitern muss, oder eine weitere Variable braucht.
Soweit ich deine Anforderung verstanden habe: Sobald du eine Taste drückst wird pressed auf true gesetzt und der Ball fällt nach unten.
Deine Implementierung macht meiner Meinung nach genau das (abgesehen davon das nicht gezeigt wird wo pressed geändert wird).

Welches gewünschte Vorhaben ist denn nicht möglich?
 

fLooojava

Bekanntes Mitglied
Hi Joose,

ich habe in meiner Mainklasse einen keyListener auf den kompletten Frame gesetzt und dies auch getestet -> Der keyListener reagiert auf das Drücken einer bestimmten Taste.

Innerhalb des Listeners steht folgender Code:
Java:
Raft xy = new Raft();
xy.setPressed();

und in meiner Raft-Klasse eben noch die setPressed() - Methode:

Java:
void setPressed(){
this.pressed=true; }

Dass es klappt, dass wenn ich mein pressed-boolean innerhalb des Threads in einer if-Abfrage toggle ist klar, jedoch funktioniert es leider immer noch nicht wenn ich versuche ihn außerhalb zu ändere, dass darauf reagiert wird.

Gruß
 
Zuletzt bearbeitet:

Joose

Top Contributor
Dass es klappt, dass wenn ich mein pressed-boolean innerhalb des Threads in einer if-Abfrage toggle ist klar, jedoch funktioniert es leider immer noch nicht wenn ich versuche ihn außerhalb zu ändere, dass darauf reagiert wird.

Was heißt "außerhalb zu ändern" in diesem Fall?

Bei "presses" handelt es sich um ein privates Attribut, das somit nur über eine Methode der Klasse "Raft" geändert werden kann.
 

fLooojava

Bekanntes Mitglied
Hi,

ja, deshalb habe ich auch die Methode setPressed in der Klasse Raft implementiert, um so von einer anderen Klasse auf diese Variable zuzugreifen bzw. sie zu verändern. ( "außerhalb" :p )

und in meiner Raft-Klasse eben noch die setPressed() - Methode:

Java Code:

Java:
  void setPressed(){
    this.pressed=true; }


Müsste doch so korrekt sein, oder übersehe ich was?
 
Zuletzt bearbeitet:

fLooojava

Bekanntes Mitglied
EDIT: Fehler wurde gefunden, ich habe ein neues Objekt erstellt und dort den Boolean geändert, was natürlich das eigentliche Objekt nicht berührt und somit keine sichtbare Auswirkung hat.

Merci.
 

coco07

Bekanntes Mitglied
Joose@
Stimmt nicht so ganz. Der Thread wird zwar "warscheinlich" irgendwann seine Variablen refreshen, aber sicher ist es nicht. Volatile kennzeichnet ja nicht nur, dass die Variable von mehreren Threads ausgelesen/verändert wird, sondern auch, dass die Threads gezwungen werden diese Variable aus dem Hauptspeicher(Heap) zu lesen.

Grüße coco07
 

Joose

Top Contributor
Joose@
Stimmt nicht so ganz. Der Thread wird zwar "warscheinlich" irgendwann seine Variablen refreshen, aber sicher ist es nicht. ....

Ok danke für den Hinweis :)
Wenn ich ehrlich bin habe ich in letzter Zeit einige Generatoren geschrieben mit mehreren Threads und bis jetzt bin ich ohne "volatile" in keine Probleme geraten.
Alle Änderungen bei Variablen sind ohne Probleme registriert worden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
B TableView: laufender Saldo mit BigDecimal? Java Basics - Anfänger-Themen 6
CT9288 Permanent laufender loop mit Eingabefunktion gesucht Java Basics - Anfänger-Themen 1
C Threads Auffindung noch laufender Programmteile Java Basics - Anfänger-Themen 2
A Dateinamen mit laufender Nummer erzeugen! Wie? Java Basics - Anfänger-Themen 9
S Objekte mit laufender Nummer erzeugen Java Basics - Anfänger-Themen 3
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 Thread.sleep() Java Basics - Anfänger-Themen 5
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
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
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
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
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
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
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
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
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
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
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
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
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben