Verständnisfrage zu Threads (und Swing)

Status
Nicht offen für weitere Antworten.

Pete23

Mitglied
ich habe ich ein Programm, dass aus 3 Threads besteht:

im ersten Thread (also in der main()) werden UI-Komponenten gestartet. danach wird das eigentliche Programm in einem neuen Thread gestartet. einzelne methoden des hauptprogramms werden über Buttons gestartet. hie und da braucht eine solche Methode dann noch eine Eingabe vom User und kann erst weitermachen, wenn diese da ist (da hab ich busy-waiting mit sleep() kombiniert). das UserInterface läuft aber in einem anderen Thread und das ganze funktioniert daher auch ohne probleme. (mit einem Thread war das UserInterface bei mir tot, während es in der anderen Methode wartete)

nun will ich jetzt noch einen dritten Thread machen, der die Aufgabe übernimmt das Programm "weiterzuklicken". sprich es gibt einen Button "weiter", der sehr oft gedrückt werden muss. der thread übernimmt das auf wunsch (das programm läuft dann über weite teile automatisiert ab.

die methode, die vom weiter-button aufgerufen wird, hat zur folge, dass einige ui-komponenten hinzugefügt/geändert werden.

und jetzt das problem:
wenn ich diesen thread mit automatischen klicks aus dem zweiten Thread heraus starte (also aus dem hauptprogramm), dann bekomme ich regelämßig folgenden error:

java.lang.ArrayIndexOutOfBoundsException: No such child: 13
at java.awt.Container.getComponent(Unknown Source)
at javax.swing.JComponent.rectangleIsObscured(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

die zahl (13) ändert sich ständig. der fehler tritt immer an anderen Stellen auf. die geschwindigkeit, mit der weitergeklickt wird, ist egal. also wenn ich zB die klicks mit einem Delay von einer Sekunde einstelle, dannn bekomme ich trotzdem die errors. wenn ich per hand weiterklicke, bekomme ich die errors nicht (auch wenn ich viel schneller klicke)

es hat also wohl etwas damit zu tun, dass die methodenaufrufe von einem anderen thread kommen.
(nehme ich an)

wenn ich nun den Klick-Thread nicht aus dem hauptprogramm starte sondern aus der UI-Komponente, wo normal auch der Button geklickt wird, dann habe ich genau dasselbe problem.

wenn ich den Thread aber aus der main-methode heraus starte, dann bekomme ich den error nicht mehr.

meine kurze und eindeutige frage: warum?
(mein problem ist gelöst, aber ich würde gerne verstehen, worauf ich da genau aufpassen muss)

thx!
 
B

Beni

Gast
Swing ist nicht threadsicher, deshalb muss sichergestellt werden, dass immer derselbe Thread auf Swing-Komponenten zugreifft.

Man kann das mit Hilfe der Methoden invakeAndWait und invokeLater sicherstellen. (z.B. einfach eine anonyme Implementation von Runnable übergeben, welche irgendeine Methode aufruft...).
 

Pete23

Mitglied
danke!! es scheint tatsähclih zu funktionieren!

eine frage noch:
wo mach ich sowas in der Regel?
ich meine ich habe in den Runnable-Teil jetzt nur einen Methoden-Aufruf rein getan, dem sehr viele andere Dinge folgen (eventuell dauert es da einige Zeit, bis das UI upgedatet wird). es funktioniert zwar anscheinend, aber soll ich das in der Regel eher genau vor einer UI-Änderung mache?
Hängt es von meinem Programm ab, wann dieser DispatchThread neue Aufagebn bekommt oder sind das einfahc regelmäßige repaints() und dergleichen?

und brauche ich das nur, wenn ich etwas entferne oder auch, wenn eine Komponente verschoben oder hinzugefügt wird oder sonst eine Änderung erfährt?
 

Pete23

Mitglied
hmm, ich habe jetzt zwei methodne geschrieben:
Code:
private void addComponent(Component comp) {
		component = comp;
		final Runnable componentAdder = new Runnable() {
		     public void run() {
		         add(component);
		     }
		};
		try {
			SwingUtilities.invokeAndWait(componentAdder);
		} catch (Exception e) {}
	}
	
	private void removeComponent(Component comp) {
		component = comp;
		final Runnable componentAdder = new Runnable() {
		     public void run() {
		         remove(component);
		     }
		};
		try {
			SwingUtilities.invokeAndWait(componentAdder);
		} catch (Exception e) {}
	}

ich verwende diese zwei Methoden jetzt anstelle von add() und remove();

zusätzlich wird noch Text aktualisiert in einer EditorPane.
auch da brauch ich ne ähnliche Methode.

mach ich das nun so, wie es gedacht ist?
und stimmt es, dass man diese Methoden nicht braucht, wenn man nur einen Thread hat? (denn da hatte ich keine probleme)
 
B

Beni

Gast
Du verwendest das schon richtig. Der tatsächliche Aufruf dieser Runnables folgt "irgendwann", aber das muss dich auch nicht gross kümmern (weil du ja in einem anderen Thread hockst).

"Nur ein Thread": musst du aufpassen, denn es gibt ja bereits ein Thread (der Dispatcher) (und noch ein paar andere, aber die sind hier nicht so wichtig), d.h. das funktioniert ausschliesslich und nur wenn du etwas änderst, z.B. direkt aus einem "actionPerformed" heraus. Wenn du jemals ein "new Thread().start();" verwendest, hast du mehr als 1 Thread.
 

Pete23

Mitglied
ja genau, meine ersten beiden SwingProgramme wurden ausschließlich über UI gesteuert, sprich alles, was passierte, passierte eben nach gedrückten Buttons oder Mausklicks, etc.
da hat das funktioniert.

das mit den mehreren Threads ist mir letztens aufgefallen. da habe ich das programm mal mit JProbe analysiert. es waren einige Threads mehr als ich selbst erzeugt hatte...

was mir jetzt noch nicht ganz klar ist:
wenn das so üblich ist, dass man diese Methoden braucht, warum gehören sie dann nicht zur API? warum gibt es kein AddThreadSafe() oder dergleichen?
liegt das einfach am Grundgedanken, also zB dass eine "kleine" Komponente selbst ja nichts von diesen "großen" übergeordneten Threads wissen muss?
 
B

Beni

Gast
Wie meinst du das mit dem "addThreadSave"? Es wäre ja nicht gut möglich einen Thread sicher zu machen (dazu müsste man in ihn "hineinlangen" oder so)? ???:L
 

Pete23

Mitglied
hmm, ich meinte, dass add() eine Componente doch einfach addet. und wenn ich es mit invokeLater mache, dann landet das ganze auf der Queue des DispatchThreads und wird erst später ausgeführt, right?

mich wundert es jetzt irgendwie, dass es dann nicht eben Methoden wie addThreadSafe() gibt, die das ganze automatisch erledigen, also automatisch den add-befehl ans ende der queue setzen (wenn man es nun wirklich so oft braucht).
grade weils in der API ja sehr oft "bequeme" Methoden gibt, die man gar nicht brauchen würde (zB. kann man sich getWidth() ja aus getSize() herleiten...)

hauptsache ist aber, dass ich das programm jetzt schon ne ganze weile teste und es geht, also nochmal danke! *freu*
 
B

Beni

Gast
Ach so meinst du das. Ich könnte mir vorstellen, dass die Programmierer lieber nicht jede Methode zweimal schreiben wollten (du kannst ja jederzeit selbst so eine Methode herstellen :wink: ), und ich weiss nicht, ob man das wirklich sooo oft braucht. (Ich hab es jedenfalls selten gesehen).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben