Threads Objekt im Konstruktor anders wie im Run()-Block

patrick_e

Aktives Mitglied
Hallo,
ich habe ein Programm das Daten aus einem Socket ausliest und danach analysiert.

Klasse 1: Liest die Nachricht aus einer Socketverbindung aus. Diese Klasse ist ein Thread und beeinhaltet eine Endlosschleife in der die Daten ausgelesen werden.
Klasse 2: Analysiert die ausgelesene Nachricht. Diese Klasse ist auch ein Thread und für jede Nachricht wird ein extra Thread angelegt.

Ich habe folgendes Problem. Im Konstruktor der Klasse 1 gibt es das Objekt transpMsg. Diese Objekt wird hier noch korrekt gefüllt. Sobald aber der Thread gestartet wird, beinhaltet transpMsg andere Daten. Wenn ich in der Funktion startAnalyze() ein sleep(50) einfüge, funktioniert es einwandfrei.

Ich hoffe ich habe es einigermaßen verständlich formuliert.
Vielen Dank schon mal für eure Mühe.

Klasse 1
Java:
public class AntMessage extends Thread {

    private static final Logger LOG = Logger.getLogger(AntMessage.class);


    public AntMessage(Antenne ant, Service_Manager sm, Guardserver guard) {
        this.sm = sm;
        this.ant = ant;
        this.guard = guard;
        executor = Executors.newCachedThreadPool();
    }

    public void run() {
        /*
         Dieser ArrayList beinhaltet die Hexa Daten die von der Antenne gesendet werden
         */
        Vector<String> hexMsg = new Vector<String>();

        connect();

        initializeSocket();
        /*
         Start der Endlos Schleife
         Hier werden die Nachrichten der Antenne abgerufen
         */
        while (!isInterrupted()) {
            try {
                int msg = readData();
                /*
                 Übersetzung der Byte Nachricht in einen Hex String
                 */
                String hexdata = normalizeHexdata(msg);
                String hexdata2 = "";
                /*
                 Wenn die Nachricht vollständig ist beginnt sie immer mit "1f"
                 */
                if (msg == VAR_CMD_START) {
                    int msg2 = 0;
                    try {
                        msg2 = antInput.read();
                        hexdata2 = normalizeHexdata(msg2);
                    } catch (Exception ex) {
                        LOG.error(ex.getMessage());
                        ex.printStackTrace();
                    }
                    if (msg2 != VAR_CMD_START) {
                        //Wenn das zutrifft dann Startet hier immer die Nachricht
                        if (hexMsg.size() > 11) {

                            startAnalyze(new TranspMsg(hexMsg));

                            lastPing = new Date().getTime();
                        }
                        hexMsg.clear();
                        hexMsg.add(hexdata);
                        hexMsg.add(hexdata2);
                    } else {
                        //Zweimal 1F hintereinander
                        hexMsg.add(hexdata);
                    }
                } else {
                    hexMsg.add(hexdata);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
public void startAnalyze(TranspMsg msg) {
        //Analyse der Nachricht starten

        final MessageAnalyse msa = new MessageAnalyse(msg, this);
        //executor.execute(msa);
        new Thread(msa).start();
        try {
         sleep(50);
         } catch (InterruptedException ex) {
         java.util.logging.Logger.getLogger(AntMessage.class.getName()).log(Level.SEVERE, null, ex);
         }

    }

    }
Klasse 2
Java:
public class MessageAnalyse implements Runnable {


    public MessageAnalyse(TranspMsg transpMsg, AntMessage antMsg) {
        synchronized (getClass()) {
            this.transpMsg = transpMsg;
            this.antMsg = antMsg;

            this.ant = antMsg.ant;
            this.guard = antMsg.guard;
            this.sql = guard.sql;
            this.dbCache=guard.dbCache;
        }
        if (transpMsg.isIsKeyboardinput()) {
            System.out.println("KEYBOARD2 " + transpMsg.toString() + " " + this.transpMsg.toString());
        }

    }

    @Override
    public synchronized void run() {
        /*
         Ist die Nachricht eine "Message over the Air" dann springt das Programm in folgende Schleife.
         */

        if (transpMsg.isIsKeyboardinput()) {
            System.out.println("KEYBOARD3 " + this.transpMsg.toString() + this.toString());
        }
 
Zuletzt bearbeitet von einem Moderator:

Kababär

Top Contributor
Am besten wartest du mal, bis der Thread zuende gelaufen ist und rufst dann nochmal die Daten ab.
Während der Thread läuft, können falsche Standbilder entstehen.

Willst du wirklich getClass() synchronisieren? Dabei sperrst du die Klasse, nicht aber die Objekte davon. Vielleicht ist ja synchronized(this) das, was du willst.
 

patrick_e

Aktives Mitglied
Vielen Dank für deine Antwort.
Ich kann nicht warten bis er zuende gelaufen ist, da ich dann Geschwindigkeitsprobleme bekomme. Daher nehme ich ja einen Thread und keine normale Klasse. Das synchronized (this) hat leider nicht den gewünschten Erfolg gebracht.
 

patrick_e

Aktives Mitglied
Ich meine den Übeltäter gefunden zu haben. in meiner Klasse TranspMsg verändert sich immer wieder die Collection hexMsg. Alle anderen Variablen bringen mir immer konstante Werte. Wie bekomme ich hexMsg Threadsafe? Ich arbeite schon mit Collections.synchronizedList(new ArrayList<String>()); aber das bringt leider nichts. Anbei die Klasse.
Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
*
* @author pe
*/
public class TranspMsg {

    private  List<String> hexMsg=Collections.synchronizedList(new ArrayList<String>());
    private final String transpId;
    private final int meldungsart;
    private final int laenge;
    private final String bewegung;
    private final String msgType;
    private final boolean isMessageOTA;
    private final int quality;
    private final boolean extendedMsg;
    private final double temp;
    private final double voltage;
    private final boolean isKeyboardinput;
    private String outString;

    public TranspMsg(final List<String> hexMsg) throws Exception {
        synchronized (this) {
            this.hexMsg = hexMsg;
        }

        transpId = hexMsg.get(8) + hexMsg.get(7) + hexMsg.get(6) + hexMsg.get(5);
        meldungsart = Integer.parseInt(hexMsg.get(4).substring(1), 16);
        laenge = Integer.parseInt(hexMsg.get(2), 16);
        bewegung = hexMsg.get(9).substring(0, 1);
        msgType = hexMsg.get(4).substring(1);
        isMessageOTA = hexMsg.get(1).equals("99");
        quality = Integer.parseInt((String) hexMsg.get(hexMsg.size() - 2), 16);
        if (laenge > 7 && hexMsg.size() > 12) {
            extendedMsg = true;
        } else {
            extendedMsg = false;
        }
        if (extendedMsg) {
            String volt = hexMsg.get(10);
            int volti = Integer.parseInt(volt, 16);
            voltage = (new Double(volti) + 100) / 100;

            int tempT = (Integer.parseInt(hexMsg.get(11) + hexMsg.get(12), 16));
            temp = ((Double.parseDouble((tempT - 500) + "")) / 10);
        } else {
            temp = 0.0;
            voltage = 0.0;
        }
        if (hexMsg.size() > 12 && hexMsg.get(10).equals("08")) {
            isKeyboardinput = true;
        } else {
            isKeyboardinput = false;
        }
        outString = "";
        for (int i = 0; i < hexMsg.size(); i++) {
            outString += (hexMsg.get(i) + " ");
        }
    }

    public synchronized List<String> getHexMsg() {
        return hexMsg;
    }
 

Kababär

Top Contributor
Entweder du verwendet Semaphoren, erweiterst deinen synchronized Block oder verwendet wait/notify.
Schau dir mal die entsprechenden Konstrukte an.

Oder verwende den Getter statt direkt das Attribut. Dann hast du aber einen kleinen Design-Fehler.
 

patrick_e

Aktives Mitglied
Ich habe den synchronized Block erweitert aber nichts hat sich geändert. Ich verwende immer den Getter(getHexMsg()) aber die List ist immer noch eine andere wie zum Beispiel die Ausgabe outString. Ich verzweifel so langsam an dem Problem.
 

fhoffmann

Top Contributor
Die Liste, die du hier erzeugst
Java:
    private  List<String> hexMsg=Collections.synchronizedList(new ArrayList<String>());
wird nie benutzt, da sie im Konstruktor mit der vom Aufrufer übergebenen Liste überschrieben wird:
Java:
    public TranspMsg(final List<String> hexMsg) throws Exception {
         synchronized (this) {
             this.hexMsg = hexMsg;
         }
Wenn der Aufrufer des Konstruktors später die Liste ändert, ist sie auch in deiner Klasse geändert.
 

patrick_e

Aktives Mitglied
Die Liste wird nicht geändert. Sie wird nur einmal hinzugefügt....
Jedoch ändert sie sich immer wieder in der erstellten Klasse TranspMsg. Obwohl sich keinerlei Setter in der Klasse befinden.
Java:
public class AntMessage extends Thread {

    private static final Logger LOG = Logger.getLogger(AntMessage.class);
    Service_Manager sm = null;
    Socket s = null;
    Antenne ant = null;
    BufferedInputStream antInput = null;
    DataOutputStream anOutput = null;
    static int VAR_CMD_START = 31;
    long startmillis;
    int count = 0;
    Guardserver guard = null;
    static final String SYSTEM_NAME = "SYSTEM";
    String antwortHost = "";
    Boolean fehler = false;
    Long lastPing = new Date().getTime();

    public AntMessage(Antenne ant, Service_Manager sm, Guardserver guard) {
        this.sm = sm;
        this.ant = ant;
        this.guard = guard;
    }

    public void run() {
        /*
         Dieser ArrayList beinhaltet die Hexa Daten die von der Antenne gesendet werden
         */

        List<String> hexMsg = Collections.synchronizedList(new ArrayList<String>());
      
        //Vector<String> hexMsg = new Vector<String>();

        connect();

        initializeSocket();
        /*
         Start der Endlos Schleife
         Hier werden die Nachrichten der Antenne abgerufen
         */
        while (!isInterrupted()) {
            try {
                int msg = readData();
                /*
                 Übersetzung der Byte Nachricht in einen Hex String
                 */
                String hexdata = normalizeHexdata(msg);
                String hexdata2 = "";
                /*
                 Wenn die Nachricht vollständig ist beginnt sie immer mit "1f"
                 */
                if (msg == VAR_CMD_START) {
                    int msg2 = 0;
                    try {
                        msg2 = antInput.read();
                        hexdata2 = normalizeHexdata(msg2);
                    } catch (Exception ex) {
                        LOG.error(ex.getMessage());
                        ex.printStackTrace();
                    }
                    if (msg2 != VAR_CMD_START) {
                        //Wenn das zutrifft dann Startet hier immer die Nachricht
                        if (hexMsg.size() > 11) {
                           
                            synchronized (this) {
                                List<String> hexMsg2 = hexMsg;
                                TranspMsg tmsg=new TranspMsg(hexMsg2);
                                startAnalize(tmsg);
                            }

                            lastPing = new Date().getTime();
                        }
                        hexMsg.clear();
                        hexMsg.add(hexdata);
                        hexMsg.add(hexdata2);
                    } else {
                        //Zweimal 1F hintereinander
                        hexMsg.add(hexdata);
                    }
                } else {
                    hexMsg.add(hexdata);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
 

fhoffmann

Top Contributor
Hier gibt es zwei Variablen, die das gleiche Objekt referenzieren:
Java:
List<String> hexMsg2 = hexMsg;
TranspMsg tmsg=new TranspMsg(hexMsg2);
eine Änderung von hexMsg ändert auch hexMsg2, und das geschieht hier:
Java:
hexMsg.clear();
hexMsg.add(hexdata);
 

patrick_e

Aktives Mitglied
Ah jetzt hab ich es verstanden....
Also müsste ich es so machen...
Java:
synchronized (this) {
                                List<String> hexMsg2 = Collections.synchronizedList(new ArrayList<String>());
                                for(int i=0;i<hexMsg.size();i++){
                                    hexMsg2.add(hexMsg.get(i));
                                }
                                TranspMsg tmsg=new TranspMsg(hexMsg2);
                                startAnalize(tmsg);
                            }
Oder geht das noch performanter?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
A Exception in Konstruktor - trotzdem wird Objekt erzeugt! Allgemeine Java-Themen 3
K Exception im Konstruktor / Objekt == null Allgemeine Java-Themen 7
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
S Variable als Objekt Name Allgemeine Java-Themen 3
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
T Objekt in Array packen Allgemeine Java-Themen 6
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
S Neues Objekt darstellen Allgemeine Java-Themen 4
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M Klassen Objekt weiter geben Allgemeine Java-Themen 1
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
S Applet Überprüfen ob ein Objekt angeklickt wurde Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
K Textdatei als Objekt Allgemeine Java-Themen 4
Viktim Classenname zu Objekt Allgemeine Java-Themen 4
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
O Klassen Bruch im gleichen Objekt Speichern Allgemeine Java-Themen 1
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
K Best Practice JFrame Objekt allgemein zugänglich machen Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
S Interaktion mit einer website (website als Objekt?) Allgemeine Java-Themen 3
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
F Neues Objekt aus .CSV definition Allgemeine Java-Themen 3
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
T Objekt kontaktiert seinen "erzeuger" Allgemeine Java-Themen 5
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
C Objekt Datenverlust nach Methodenaufruf Allgemeine Java-Themen 9
H JavaFX Von einer Methode auf stage-Objekt zugreifen Allgemeine Java-Themen 3
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
P Konsoleneingabe übernehmen und Objekt instanzieren. Allgemeine Java-Themen 5
E Auf Java-Objekt aus anderer Instanz zugreifen Allgemeine Java-Themen 26
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6
P Objekt Array in Datei Speichern Allgemeine Java-Themen 3
F Dynamisch ein Objekt einer bestimmten Subklasse erstellen Allgemeine Java-Themen 7
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
V Objekt löschen Allgemeine Java-Themen 7
A OOP Wie auf Objekt der Superklasse zugreifen? Allgemeine Java-Themen 6
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
M neues Objekt speichern, nicht Referenz Allgemeine Java-Themen 10
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
F Objekt einer Datei verschieben, aber Verzeichnispfad fehlt Allgemeine Java-Themen 6
C Objekt Typ herausfinden Allgemeine Java-Themen 5
E Objekt beim Erzeugen in ArrayList Allgemeine Java-Themen 9
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
D Eigenen Objekt Pool Allgemeine Java-Themen 15
C blueJ: Objekt wird nicht in Objektleiste angezeigt Allgemeine Java-Themen 8
T Objekt 2x deserialisieren, aber nur 1x im Heap haben? Allgemeine Java-Themen 4
sambalmueslie Benachrichtigung bei neuer Objekt-Instanz Allgemeine Java-Themen 5
U Konstante in Objekt definieren Allgemeine Java-Themen 6
D this mit Objekt überschreiben Allgemeine Java-Themen 17
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
E Objekt erstellen Allgemeine Java-Themen 7
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
M Swing-Frontend abhängig von ausgewähltem Objekt Allgemeine Java-Themen 4
J Lebt das Objekt noch?? Allgemeine Java-Themen 12
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
B Speicherverbrauch Objekt-Referenz Allgemeine Java-Themen 11
D Browser-Objekt erzeugen Allgemeine Java-Themen 8
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
A Iterationen einer XML-Datei in einem Objekt sichern Allgemeine Java-Themen 5
R Objekt zur Laufzeit zerstören? Allgemeine Java-Themen 12
hdi Frage zur Objekt Initialisierung Allgemeine Java-Themen 4
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben