Wert aus Thread "entnehmen"

MartyMcFly

Mitglied
Hallo zusammen,

Ich programmiere gerade an einer Projektarbeit und da bin ich auf ein grundlegendes Problem gestoßen.

Wie kann mein Hauptprogramm auf z.B. 2 Integerwerte meines laufenden Threads "zugreifen"?

Das heisst, ich will z.B. in einem Thread, die Koordinatenwerte für ein Rechteck, das in meiner MainClass durch die Paint-Methode gezeichnet wird, ausrechnen. Wie komme ich an diese Werte heran?

Habe schon etwas über Callable gelesen, gibt nicht aber vieleicht eine schlauere Methode so etwas zu lösen?

Hoffe man versteht mein Problem.

Mfg
 
Poste doch bitte etwas Code, daran lässt sich leichter nachvollziehen, was du genau meinst. Oder geht es nur um etwas allgemeinere Dinge?
 
Ja also erstmal würde ich gerne, ganz generell wissen, wie man vorgeht, wenn man einen Wert aus Threads haben will. Vieleicht kann ich ja eine Rückgabe allgemein umgehen.

Meinen Code muss ich vorher etwas ausdünnen. 🙂
 
Wenn du auf deine Threads zugreifen willst dann brauchst du ne Referenz und kannst darauf dann getter aufrufen. Callables sind Tasks mit Rückgabewerten. Die laufen ne Zeit lang und geben dir dann nen Ergebniss zurück.
 
So hier mal mein reduzierter Code.
Ergibt noch keinen Sinn, aber als Beispiel reicht's erstmal.
Wie komme ich jetzt hier an die werte von x und y aus dem Thread "move"?

Java:
import java.awt.*;
import java.awt.event.*;

public class Example1Applet extends java.applet.Applet implements Runnable {
	
    Thread animator;
    Thread move=new Thread(new MoveShape());
    int x=100;
	int y=100;
    
    public void init() {
    	setSize(1200,600);
    }

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

    public void run() {
		while (Thread.currentThread() == animator) {
			repaint();
		}
	}
    
    public void stop() {
		animator = null;
    }

    public void paint(Graphics g) {
    	g.setColor(Color.black);
    	g.fillRoundRect(x, y, 15, 15, 15, 15);
    }

}

Java:
public class MoveShape implements Runnable {

	public int x=0;
	public int y=0;
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		try{
			Thread.sleep(200);
			x++;
			y++;
		}catch(InterruptedException e){}
	}
}
 
Um das Try-Catch in deiner MoveShape Klasse müsstest du noch einen Schleife machen, damit wiederholt die Variablen inkrementiert werden. So läuft die run() Methode einmal durch, und dann ist der Thread auch schon fertig.

Java:
public class MoveShape implements Runnable {
    private int x=0;
    private int y=0;
    private boolean running = false;
    
    @Override
    public void run() {
        running = true;
        while(running) {
          try{
              Thread.sleep(200);
              x++;
              y++;
          }catch(InterruptedException e){}
        }
    }
    public int getX(){ return x; }
    public int getY(){ return y; }
    public void stopRunning(){ this.running=false; }
}

Zusätzlich hat die Klasse noch eine Methode zum Beenden der While-Schleife. Über die beiden Getter-Methoden bekommst du die aktuellen Werte der beiden Variablen. Die Werte ändern sich aber in der Klasse weiterhin, das bekommst du aber nach dem Getter-Aufruf nicht mehr mit.

So sehr viel haben meine Ausführungen aber nicht mehr mit deinem Problem und deinem Code zu tun, merke ich gerade. Du könntest den MoveShape Thread als innere Klasse in der Applet-Klasse realisieren, so dass MoveShape Zugriff auf x und y hat. Die beiden Variablen wären dann nur in der Applet Klasse definiert. Dann müsste die Applet-Klasse auch nicht Runnable implementieren.
 
Zuletzt bearbeitet:
Vielleicht besser als die Werte aus dem Thread zu holen, wäre diese aus dem Thread heraus im "Eigentümer" der Variablen zu ändern. Schießlich muss ja auf der darstellenden Komponente auch noch repaint() aufgerufen werden. (Die Dauerschleife ist mehr als unschön).
Noch besser wäre die Werte in einem Objekt zu kapseln.
 
Nochmal eine vieleicht blöde Frage, die Werte in einem Objekt zu kapseln, heisst in einer neuen Datei eine neue Klasse mit 2 int Attributen zu erstellen oder ?
 
Ja genau MartyMcFly.
Werte in ein Object kapseln ist eine neue Klasse mit den Werten zu erstellen

Java:
public class Coordinate {
  private int x;
  private int y;

  public Coordinate(in pX, int pY) {
    x=pX;
    y=pY;
  }

  public int getX() { return x;}
  public int getY() { return y;}
  public void increaseX() { x++;}
  public void decreaseX() { x--;}
  public void increaseY() { y++;}
  public void decreaseY() { y--;}
}
 

Neue Themen


Zurück
Oben