Verständnisproblem Threads

myjday

Aktives Mitglied
Schönen guten Abend,

ich wollte zwei Kreise auf einem Panel kreisen lassen. Gleicher Radius, gleiche Sleeptime, nur dass sie sich entgegengesetzt drehen, sprich sich pro Umlauf zwei mal überlappen. tut aber nicht.
Er macht mir immer nur den zweiten Thread.
Habe einfach zwei neue Threads hintereinander angefügt.

Warum wechseln sich die Threads nicht ab? Ich hab sie doch beide auf den EDT gelegt????:L

Hier die Quellen:

Java:
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Oberflaeche extends JFrame {

	static DrawPane p;
	static DrawPane q;

	public static void main(String[] args) {

		Runnable r = new Runnable() {

			public void run() {

				JFrame f = new JFrame("MyDraw 2010");

				f.setSize(new Dimension(500, 500));
				f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);

				p = new DrawPane();
				q = new DrawPane();

				f.add(p);
				f.add(q);
				f.setLocationRelativeTo(null);

				f.setVisible(true);
			}
		};

		EventQueue.invokeLater(r);

		new Thread() {

			public void run() {

				while (true) {

					EventQueue.invokeLater(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							
							int radius = 150;
							
							p.x = p.getWidth()/2 + (int) (radius * Math.cos(Math.toRadians(p.winkel)));
							p.y = p.getHeight()/2 + (int) (radius * Math.sin(Math.toRadians(p.winkel)));
							p.repaint();
							
							p.winkel++;
				
						}
					});
					
					
					try {
						Thread.sleep(10);
					} catch (InterruptedException in) {
					}

				}
			};

		}.start();

		new Thread() {

			public void run() {

				while (true) {

					EventQueue.invokeLater(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							
							int radius = 150;
							
							q.x = q.getWidth()/2 + (int) (radius * Math.cos(Math.toRadians(q.winkel)));
							q.y = q.getHeight()/2 + (int) (radius * Math.sin(Math.toRadians(q.winkel)));
							q.repaint();
							
							q.winkel--;

						}
					});
					
					
					try {
						Thread.sleep(10);
					} catch (InterruptedException in) {
					}

				}
			};

		}.start();
		
	}

}

und noch mein DrawPane

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JPanel;

public class DrawPane extends JPanel {

	public int x;
	public int y;
	public int z;
	public int winkel;

	public DrawPane() {

		this.x = this.getWidth()/2;
		this.y = this.getHeight()/2;
		this.z = 20;
		this.winkel = 0;
	}

	@Override
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		super.paintComponent(g);

		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);

		g2.setColor(Color.RED);

		g2.fillOval(x, y, z, z);

	}
}

Idee?

Dane & Gruß,

myjday
 

icarus2

Top Contributor
Also wenn du zwei Threads auf dem EDT started, so wird zuerst der eine Thread ausgeführt. Ist dieser beendet, so wird der zweite ausgeführt.

Wenn du etwa auf dem EDT startest, so kommt das in die EventQueue. In einer Queue (Schlange) kann immer nur einer gleichzeitig dran kommen. Ist dieser fertig, so kommt der nächste dran (vgl. Schlange am Billetschalter und ein Kunde ist ein Thread. Da muss der eine Kunde warten, bis der andere fertig ist).

Wenn du mehrere Threads parallel laufen lassen willst, so darfst du diese auf keinen Fall auf dem EDT aufrufen. Die EventQueue wird sonst von einem Thread blockiert. Lediglich Initialisierungen und Änderungen an der Swing GUI müssen auf dem EDT passieren (diese Änderungen sollten nicht allzu lange dauern, sonst friert die GUI, ja sogar das Eventhandling ein).

Hoffe ich konnte dir helfen...
 

myjday

Aktives Mitglied
erstmal Vielen Dank für die schnelle Hilfe!

Dann hab ich das Prinzip noch nicht verstanden. Ich hab das so aufgefasst, dass ich alle Threads auf den EDT lege und dieser das so organisiert, dass für den User der Eindruck einer Quasiparalellität zwischen den Threads entsteht.

Na ja, ich werds mir nochmal anschauen ....

Gruß,
myjday
 

Marco13

Top Contributor
@icarus2: Schlafmangel? ;)

Das ganze hat mit Threads nichts zu tun, und icarus2 schreibt sonst glaubich auch eher vernünftige Sachen ;) Das ganze funktioniert so und ist in bezug auf die Threads soweit ich das sehe vollkommen richtig. Das Problem ist, dass es zwei DrawPane-Instanzen gibt, und die Quasi "übereinandergemalt" werden müssten. Wenn man im Konstruktor sowas macht wie
Code:
                p = new DrawPane();
                q = new DrawPane();
                f.setLayout(null);
                f.add(p);
                f.add(q);
                p.setBounds(0,0,500,500);
                q.setBounds(0,0,500,500);
                p.setOpaque(false);
                q.setOpaque(false);
                f.setLocationRelativeTo(null);
funktioniert das auch alles. Aber besser wäre es natürlich, wenn es nur EIN DrawPane gäbe, das beliebig viele Kreise zeichnen könnte (das könnten dann z.B. objekte einer eigenen Klasse "Circle" sein, die eine Position speichert, die von den Threads verändert wird, und von denen dann mehrere in einer Liste im DrawPane liegen könnten...)
 

eRaaaa

Top Contributor
Mhm..wobei das invokeLater in den beiden Threads hier doch eig. unnötig ist und den Code nur mehr aufbläht, repaint() kann doch ruhig AFAIK aus jedem Thread aufgerufen werden?!
Ansonsten könnte man evtl. auch überlegen einen Timer/Swingtimer zu benutzen, dann spart man sich auch direkt das Thread.sleep ???:L
 

icarus2

Top Contributor
Ich hab schon wenig geschlafen... aber grad sooo wenig :-/ Ich hätte mir den Code wohl genauer ansehen sollen und besser überlegen was ich da überhaupt schreibe.

Naja, sorry für den Mist, den ich da oben verzapft habe. Ich sollte wohl besser mal ins Bett gehen ^^
 

Marco13

Top Contributor
Ja, wie viel man davon aus dem EDT rausziehn könnte, hatte ich auf überlegt. Im zweifelsfall könnte dort ALLES aus dem EDT raus, wenn das nicht das getWidth() drinstünde... vermutlich ist das da ziemlich wurscht (d.h. das könnte auch ohne EDT gemacht werden), aber "rein formal" muss es eben so sein...
 

myjday

Aktives Mitglied
Hallo Marco13,

es drehen sich zwei Kreise.

Vielen Dank an Alle. Ich versteh zwar noch nicht alles was ihr geschrieben habt, aber ich bleibe dran.

Gute Nacht ....
myjday
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
nonickatall Grundsätzliches Verständnisproblem des Aufbaus eines Programms Java Basics - Anfänger-Themen 19
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Verständnisproblem mit Assoziationen Java Basics - Anfänger-Themen 7
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
A Erste Schritte Verständnisproblem Java Basics - Anfänger-Themen 5
S Verständnisproblem Aufgabe Java Basics - Anfänger-Themen 9
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
temi Verständnisproblem Class.forName() Java Basics - Anfänger-Themen 3
2 Verständnisproblem bei Anwendung von Lower Bounded Wildcards Java Basics - Anfänger-Themen 5
V Verständnisproblem Java Basics - Anfänger-Themen 22
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
J Verständnisproblem einer Methode Java Basics - Anfänger-Themen 20
M Konstruktur - Verständnisproblem Java Basics - Anfänger-Themen 4
C Postinkrement und println - Verständnisproblem Java Basics - Anfänger-Themen 8
T Verständnisproblem beim Vigenere-Verfahren Java Basics - Anfänger-Themen 2
Q MVC Verständnisproblem: Controller vs model.modelChanged() Java Basics - Anfänger-Themen 0
N Verständnisproblem InsertionSort. Java Basics - Anfänger-Themen 2
D Verständnisproblem Java Basics - Anfänger-Themen 2
B VerständnisProblem mit Beispielaufgabe aus Buch Java Basics - Anfänger-Themen 1
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
V Verständnisproblem Java Basics - Anfänger-Themen 5
V Arrays-verständnisproblem Java Basics - Anfänger-Themen 4
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
S Verständnisproblem einer Übungsaufgabe Java Basics - Anfänger-Themen 6
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
P Verständnisproblem main Methode Java Basics - Anfänger-Themen 9
S Klassen Verständnisproblem Konstruktor Java Basics - Anfänger-Themen 7
I e.getMessage(); - Verständnisproblem Java Basics - Anfänger-Themen 6
lesni Vererbung Vererbung - Verständnisproblem Java Basics - Anfänger-Themen 2
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
J Verständnisproblem Methoden-Kettung Java Basics - Anfänger-Themen 3
A Vererbung Verständnisproblem bei Übung Java Basics - Anfänger-Themen 5
E Verständnisproblem Typkonvertierung Java Basics - Anfänger-Themen 4
S OOP Verständnisproblem Umsteiger Java Basics - Anfänger-Themen 22
C Array Verständnisproblem Java Basics - Anfänger-Themen 3
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
L Eclipse verlangt "{" nach ";"... Verständnisproblem Java Basics - Anfänger-Themen 5
D charAt(i) verständnisproblem Java Basics - Anfänger-Themen 4
D Verständnisproblem Marken und Schleifen Java Basics - Anfänger-Themen 19
M Verständnisproblem bei Ternären Operanten bzw. Bedingungsoperator Java Basics - Anfänger-Themen 8
T Datentypen Verständnisproblem mit main Methode Java Basics - Anfänger-Themen 3
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
B Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8
A Postinkrement-Verständnisproblem Java Basics - Anfänger-Themen 12
R Iterator Liste, Verständnisproblem Java Basics - Anfänger-Themen 4
1 Verständnisproblem mit Foreach Java Basics - Anfänger-Themen 4
B Verständnisproblem bei Vererbung Java Basics - Anfänger-Themen 3
W generisches Programmieren - Verständnisproblem Java Basics - Anfänger-Themen 4
A Verständnisproblem Nr 2 Java Basics - Anfänger-Themen 14
A Verständnisproblem Java Basics - Anfänger-Themen 6
A Array Verständnisproblem Java Basics - Anfänger-Themen 8
G Verständnisproblem --> JTree Java Basics - Anfänger-Themen 6
M Verständnisproblem mit der Klasse Thread Java Basics - Anfänger-Themen 10
N BufferedReader Verständnisproblem Java Basics - Anfänger-Themen 12
G Verständnisproblem: Code kompelieren und interpretieren Java Basics - Anfänger-Themen 3
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
G Verständnisproblem Türme von Hanoi Java Basics - Anfänger-Themen 4
G Verständnisproblem Serverinput einlesen. Java Basics - Anfänger-Themen 4
J Array und Schleifen Verständnisproblem Java Basics - Anfänger-Themen 25
G Verständnisproblem Java Basics - Anfänger-Themen 4
N Verständnisproblem: Mehrere Objekte einer Klasse erstellen Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
V Verständnisproblem mit Abstrakten zu Konkreten Klassen Java Basics - Anfänger-Themen 7
A Problem mit der Stringgrösse, bzw Verständnisproblem? Java Basics - Anfänger-Themen 14
A Verständnisproblem mit ScrollPanel Java Basics - Anfänger-Themen 3
R Verständnisproblem mit Hibernate Java Basics - Anfänger-Themen 2
T Verständnisproblem mit equals() Java Basics - Anfänger-Themen 4
N datei byte für byte auslesen (verständnisproblem) Java Basics - Anfänger-Themen 2
T Verständnisproblem packages/import Java Basics - Anfänger-Themen 9
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38
D Verständnisproblem Java Basics - Anfänger-Themen 6
S for Schleifen: Verständnisproblem Java Basics - Anfänger-Themen 15
T Vererbung von Attributen und Methoden, Verständnisproblem Java Basics - Anfänger-Themen 4
bernd while-Schleife: Verständnisproblem Java Basics - Anfänger-Themen 7
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
G GridBagLayout: Verständnisproblem Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben