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....
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.
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?
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 =newRaft();
xy.setPressed();
und in meiner Raft-Klasse eben noch die setPressed() - Methode:
Java:
voidsetPressed(){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.
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.
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" )
und in meiner Raft-Klasse eben noch die setPressed() - Methode:
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.
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.
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.