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!
 

mrBrown

Super-Moderator
Mitarbeiter
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
 

Fohnbit

Top Contributor
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!
 

Fohnbit

Top Contributor
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?
 

mrBrown

Super-Moderator
Mitarbeiter
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
 

mrBrown

Super-Moderator
Mitarbeiter
Das wird allerdings im gleichen Thread ausgeführt, damit das ein anderer Thread macht, muss schon mehr passieren ;)
 

mrBrown

Super-Moderator
Mitarbeiter
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?
 

Fohnbit

Top Contributor
Also das leuchtet mir jetzt ein :)

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

Danke für die Richtigstellung!
 

Fohnbit

Top Contributor
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!
 

mrBrown

Super-Moderator
Mitarbeiter
Und die werden einfach direkt ausgeführt oder hängen die zB von Nutzereingaben während das Programm läuft ab?
 

Fohnbit

Top Contributor
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.
 

mrBrown

Super-Moderator
Mitarbeiter
Und wann soll A was mit den von B geladenen Daten machen?

Ich würde (vermutlich) Future oder eine BlockingQueue nutzen...
 

mrBrown

Super-Moderator
Mitarbeiter
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...
 

DrZoidberg

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
N Thread - Daten übergeben Java Basics - Anfänger-Themen 7
E Daten von GUI zu Thread Java Basics - Anfänger-Themen 2
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
W Daten in Echtzeit übernehmen Java Basics - Anfänger-Themen 5
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
M Tabellen- Daten laden Java Basics - Anfänger-Themen 2
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
D Sportwetten Daten Atomatisch analysieren um optimale Strategie zu erhalten Java Basics - Anfänger-Themen 6
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Minesweeper - Daten Java Basics - Anfänger-Themen 46
A Eingelesene Daten in Array(Liste) abspeichern? Java Basics - Anfänger-Themen 18
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
R Eigenes Protokoll zur Übermittlung von Daten zum Webserver? Java Basics - Anfänger-Themen 4
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
S Daten aus eigenständiger .class-Datei abrufen Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L Java Programm zum Auswerten von Daten Java Basics - Anfänger-Themen 11
H Passwortmanager, Sicherheit der Daten Java Basics - Anfänger-Themen 12
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
M Best Practice Daten-Import /Trabsfomration aus Textdatei Java Basics - Anfänger-Themen 12
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
M Erste Schritte Speichern von mehreren Daten Java Basics - Anfänger-Themen 3
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
P Methoden ausgelesene (CSV-) Daten in Liste einer anderen Klasse einlesen Java Basics - Anfänger-Themen 0
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
F Daten auf Webserver laden - wiederholen bei Fehler Java Basics - Anfänger-Themen 0
W Best Practice problemabhängige Persistentmachung von Daten Java Basics - Anfänger-Themen 6
P Daten von Internetseite auslesen Java Basics - Anfänger-Themen 10
N Daten/Formular per POST an Firefox/Browser senden Java Basics - Anfänger-Themen 7
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
T JTable Daten aus txt datei Java Basics - Anfänger-Themen 3
T printf Daten aus der Tabelle in Excel übernehmen Java Basics - Anfänger-Themen 5
P zweidimensionales Array anlegen und mit DB-Daten füllen Java Basics - Anfänger-Themen 14
V Einlesen von Daten Java Basics - Anfänger-Themen 8
J TableView zeigt keine Daten an Java Basics - Anfänger-Themen 14
J Daten im Programm speichern Java Basics - Anfänger-Themen 14
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
O Probleme mit CSV Daten Java Basics - Anfänger-Themen 10
M Arrays: Trennung von Daten und Darstellung Java Basics - Anfänger-Themen 1
S Daten aus Array in Klasse übertragen Java Basics - Anfänger-Themen 12
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
R Daten via Post an php Script senden Java Basics - Anfänger-Themen 1
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
W (XML/XSL) Daten aus Eclipse in eine Klasse Laden. Java Basics - Anfänger-Themen 1
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
D Daten von einem int in einen string Java Basics - Anfänger-Themen 5
L Daten aus Array Feld löschen Java Basics - Anfänger-Themen 2
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
fLooojava Daten im selben Netzwerk an IP Java Basics - Anfänger-Themen 1
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
P Daten auslesen und in CSV speichern Java Basics - Anfänger-Themen 6
J Daten aus zweiter Klasse importieren Java Basics - Anfänger-Themen 33
C Daten speichern und laden Java Basics - Anfänger-Themen 6
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
J Daten von einer PHP Datei ablesen Java Basics - Anfänger-Themen 1
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
K Daten (im Sinne von Datum) aus Webseiten extrahieren Java Basics - Anfänger-Themen 6
S Erste Schritte Tage zwischen 2 Daten berechnen Java Basics - Anfänger-Themen 6
A daten vom 1d array in 2d matrix speichern Java Basics - Anfänger-Themen 3
R csv-Datei auslesen und ausgelesene Daten in neue csv-Datei speichern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben