Daten von Thread an den aufrufenden zurückgeben

Fohnbit

Top Contributor
Hallo,

ich erstelle einen Thread um Daten aus dem Web zu laden:
Java:
pullData = new PullData(getPropertyCityId(), getPropertyUserId(), this);
            pullData.run();

Java:
public class PullData extends Thread {
    public String cityId, userId;
    WeatherForecast weatherForecast;

    PullData(String cityID, String userId, WeatherForecast weatherForecast) {
        this.cityId = cityID;
        this.userId = userId;
        this.weatherForecast = weatherForecast;
    }

    public void run() {
...
    weatherForecast.pullData(doc);

Java:
public synchronized void pullData(Document doc) {

        NodeList locations = doc.getElementsByTagName("location");
        Node location = locations.item(0);

Ich übergebe eine Referenz des Ursprung und rufe dann im Thread eine Methode auf um die Daten in der Hauptanwendung zu verarbeiten.

Ist das soweit ok?

Danke!
 
Du solltest dir noch mal Grundlagen zu Threading angucken 😉

run startet keinen Thread, sondern führt die Methode ganz synchron aus.
Thread solltest du nicht extenden.

Und um irgendwas sonst dazu zu sagen, müsste man mehr Code sehen, in dem Code passiert ja nichts
 
Hallo,

🙂 ... ja stimmt.

Habs nun so abgeändert:
Java:
public class SocketClient implements Runnable {
Thread t;
    SocketClient(RS485 parent, Socket s) {
        t = new Thread(this, "Rs485 Polling Thread");
        this.parent = parent;
        socket = s;
        setDesonnected(false);
        t.start();
    }
public void run() {
...
}
}

Gestartet mit:
Java:
socketClient = new SocketClient(this, socket1);

Rückgabe an die Main Klasse von der "SocketClient" Klasse:
Java:
parent.receiveNewBytes(got, false);

Die ursprüngliche Frage bleibt aber:
Die Rückgabe durch einen direkten Verweis der Klasse ist ok, oder sollte man mit Interfaces arbeiten?
Normal sollte immer nur ein Thread laufen, der sich wieder beendet. Auf die Main Klasse wird also nie zur selben Zeit zugegriffen.

Danke!
 
Die Main Klasse erzeugt den Thread
Der Thread ruft Daten ab und muss es dem Main Thread zurückgeben

Eigentlich mache ich immer ein Interface das beide nutzen. Aber in einem Beispiel wurde einfach ein Verweis mittels Variable übergeben und über diesen Verweis wurde dann eine Methode in der Main Klasse gestartet:
Java:
public class RS485 {
...
private SocketClient socketClient;
...
socketClient = new SocketClient(this, socket1);
...
public void receiveNewBytes(byte[] msg, boolean controlMessage) {
...
}
}

public class SocketClient implements Runnable {
    Thread t;
    private RS485 parent;
    SocketClient(RS485 parent, Socket s) {
        t = new Thread(this, "Rs485 Polling Thread");
        this.parent = parent;
        socket = s;
        t.start();
    }

public void run() {
...
parent.receiveNewBytes(got, false);
...
}

1. Über die "RS485" Klasse wird der Thread "SocketClient" erzeugt und gestartet.
2. Die Klasse "SocketClient" bekommt im Konstruktor einen Verweis auf die Main Klasse "RS485"
3. Die Klasse "SocketClient" ruft danach die Methode "receiveNewBytes" in der Klasse "RS485" auf und übergibt die Daten
4. Die Klasse "SocketClient" wartet auf neue Daten und falls welche eintreffen, wird wieder die Methode "receibeNewBytes" aufgerufen

Hoffe ich habs verständlich beschrieben. So kann man das lassen?
 
Naja, ich seh bisher nicht, wo Daten zwischen Threads ausgetauscht werden, nur einer Methode in einer anderen Klasse übergeben...


BTW: Konstruktoren, die solche Logik enthalten (also z.B. Thread mit sich selbst starten), sind ziemlicher Unsinn
 
Das wird allerdings im gleichen Thread ausgeführt, damit das ein anderer Thread macht, muss schon mehr passieren 😉
 
Ja doch, aber Methoden werden halt immer in dem Thread ausgeführt, in dem sie aufgerufen werden. Woher soll denn sonst eine Methode wissen, zu welchem Thread sie gehört und in welchem sie grad aufgerufen werden soll?
 
Also das leuchtet mir jetzt ein 🙂

Dann baue ich es wie üblich mit Interfaces und gebe einen Listener hinzu.

Danke für die Richtigstellung!
 
Hallo,

nun möchte ich das Thema doch noch richtig abschließen:
Ich habe eine Klasse:
Klasse-A
Die Klasse-A muss Daten aus dem Internet abrufen und der Abruf soll in einem eigenen Thread stattfinden, damit die Klasse-A nicht blockieren kann.
Daher wird Klasse-B als ein neuer Thread gestartet und die nötigen Parameter übergeben.
Wenn Klasse-B alle Daten abgerufen hat, soll es diese an die Klasse-A zurückgeben und die Daten an die dortige Methode-A übergeben.

Wie wäre nun die korrekte Vorgehensweise?

Danke!
 
Die Methoden werden von einem OSGi System getriggert. So kann es sein, das während des Web Abrufes, ein Berechnung in Klasse-A stattfindet. Diese Berechnung darf aber nicht verzögert werden, wenn der Webabruf in einem Timeout hängt oder länger dauert.
 
Und wann soll A was mit den von B geladenen Daten machen?

Ich würde (vermutlich) Future oder eine BlockingQueue nutzen...
 
Die Methoden werden von einem OSGi System getriggert. So kann es sein, das während des Web Abrufes, ein Berechnung in Klasse-A stattfindet.
Findet die Berechnung nur in einer Methode von Klasse A oder in dem Thread, aus dem du den Thread für B startest, und der die Daten von B verbreiten soll, statt? Klassen und Threads muss man hier trennen.
Müssen die Daten zwingend von dem Thread, der auch die anderen Methoden in A ausführt, ausgeführt werden, oder muss es einfach nur ein andere Thread sein?
Also - ist der Thread oder ist die Klasse relevant?

Ich würde am ehesten BlockingQueue verwenden, allerdings bin ich mir noch nicht sicher, ob genug Verständnis von Threads vorhanden ist...
 
Die korrekte Vorgehensweise gibt es nicht. Nur eine Reihe verschiedener Optionen, die jeweils ihre eigenen Stärken und Schwächen haben.
Du kannst manuell Threads starten und Daten z.B. mit einer BlockingQueue übertragen.
Du köntest auch einen ExecutorService und Futures verwenden.
Auch sehr interessant ist der Einsatz eines AsynchronousSocketChannel, was asynchrone Netzwerkprogrammierung im Node.js Stil ermöglicht, d.h. man kann z.B. einen Server schreiben, der tausende von TCP Verbindungen gleichzeitig bedienen kann, ohne den Overhead von tausenden Threads in Kauf nehmen zu müssen. Hier ist mal ein Artikel dazu.
 

Neue Themen


Zurück
Oben