Wert in Variable schreiben, wenn diese gerade genutzt wird

Fohnbit

Top Contributor
Hallo!

Ich habe wohl ein Thread/Timing Problem?

Über 16 Methoden erhalte ich Boolesche Werte.
Ich halte diese Summe als Integer (16bit eben)

Wenn nun eine Methode einen Wert empfängt, update ich den Integer und warte mit der Weiterverarbeitung des Integer noch 50 Millisekunden (falls noch andere Methoden auslösen) und sende den Int Wert per UDP weiter.


Nun kann aber anscheinend passieren, das manche Werte von Methoden nicht übernommen werden. Ich vermute eben das ich ein Thread / Timing Problem habe, denn das passiert nur, wenn die Methoden fast zur selben Zeit Werte empfangen:

Methoden die auslösen:
Java:
sa = new snmpSA(getPropertyAddress(), getPropertyPort(),
         getPropertyCommunity(), this);

public void onChannel1(boolean value) {
        if (running)
            sa.sendChannel(1, value);
    }
usw. für die anderen 15 Methoden.
Running is nur aktiv, wenn die UDP Verbindung steht. Die ist fast immer "on".

Die Klasse snmpSA selbst:
Java:
    public snmpSA(final String host, final int port, String community,
            final NetworkListener networklistener) {
        executor = Executors.newSingleThreadScheduledExecutor();
        Address tHost = GenericAddress.parse(host + "/" + port);
        try {
            transport = new DefaultUdpTransportMapping();
        } catch (IOException e) {
            e.printStackTrace();
        }
        snmp = new Snmp(transport);
        try {
            transport.listen();
        } catch (IOException e) {
            e.printStackTrace();
        }
        target = new CommunityTarget();
        target.setCommunity(new OctetString(community));
        target.setAddress(tHost);
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version1);
        this.networkListener = networklistener;

        hostAliveTimer = executor.scheduleAtFixedRate(new Runnable() {
            public void run() {
                snmpGet(EnumSAOID.Location.toString());
            }
        }, 20, 20, TimeUnit.SECONDS);

Und die Methode, die den Integer Wert aufbereitet:
Java:
public void sendChannel(int channel, boolean value) {
        if (value) {
            setSaStatus(saStatus | (1 << channel - 1));
        } else {
            setSaStatus(saStatus & ~(1 << channel - 1));
        }
        if (!busy) {
            busy = true;
            snmpSetValue(50);
        }

    }
Wenn also nicht busy, wird gesendet, ansonsten nicht.
Nach dem senden ist busy wieder false.

Da der Integer auch nach dem Senden nicht den Wert der Methoden angenommen hat, kanns nur so sein, dass die Methode "sendChannel(int channel, boolean value)" gar nie aufgerufen wird.

Optimal wäre es, wenn die Klasse zum senden der UDP Pakete ein eigener Thread wäre und die zentrale Integer Variable als gemeinsame Variable genutzt werden könnte.

Oder wie löst man sonst das Problem?

Vielen Dank
 

Fohnbit

Top Contributor
Ich schreibe ein Plugin ... die Methode wird überschrieben "@Override" und somit aufgerufen.
Diese Methoden Aufrufe sind schon 100.000mal vom Hersteller genutzt und da paßt sicher alles.

Daher bin ich mir sicher das die Methoden getriggert werden mit den Werten ... das Problem muss an meiner Architektur liegen, da wohl beim senden mit UDP meine Klassen blockieren(?)
 

CSHW89

Bekanntes Mitglied
Ich nehme an, es liegt an dieser Zeile bzw die im else-Zweig auch: "setSaStatus(saStatus | (1 << channel - 1))".
Sagen wir saStatus ist 0, und der erste Thread ist fertig, ruft also sendChannel() auf, ist nun in dieser Zeile und fragt zunächst den Wert von 'saStatus' ab. Dieser ist 0. Genau in desem Moment wechselt das Programm zu Thread 2, der auch gerade fertig wird und sendChannel() aufruft. Nun setzt er 'saStatus' z.b. auf 4. Wenn jetzt wieder zu Thread 1 gewechselt wird, rechnet er seine Rechnung nicht mit dem neuen Wert 4 weiter, sondern mit 0.
Ein 'synchronized' für die Methode 'sendChannel' sollte reichen.

lg Kevin
 

Fohnbit

Top Contributor
Hallo Kevin,

habe ich nun getestet und leider ist das Problem noch immer.
Was ich bemerkt habe:
Aus Eclipse auf meinem Win8 PC ist das Problem nicht.
Aber der Code läuft auf einem Mini Linux System ... da habe ich das Problem.
Scheint wohl ein Performance Problem zu sein.

Ich vermute wenn die Klasse die UDP Daten sendet, blockiert es den Empfang von neuen Daten, da der interne INT auch nicht aktualisiert wird.

Hätte jemand ein Beispiel wie man sowas aufbaut:
1. Methoden empfangen Boolean Wert
2. Zentraler Integer Wert muss aktualisiert werden
3. Wenn sich der Integer Wert ändert, soll nach 50ms der Integer per UDP gesendet werden
(jedoch soll die Main Klasse bei neu eintreffenten Werten die Integer auch aktualisieren und nach dem 1.Senden wieder 50ms senden

Wäre das eine Consumer/Producer Lösung?
Für Hilfe wäre ich echt dankbar!
 

Thallius

Top Contributor
Wenn du 16x ließt in 50ms, dann bist du bei unter 3ms pro Vorgang. Bei solchen "Echtzeit"-Anwendungen bist Du mit Java sehr schnell an der Grenze des möglichen.
 

Fohnbit

Top Contributor
Hallo,

die 16 Inputs werden so schnell wie möglich getriggert.
Wenn in Summe es 150ms dauert, werden eben mehrere UDP Befehle gesendet.

Der Grund, das ich jeden Bool Wert nicht einzeln mit SNMP sende ist, da ich UDP Telegramme reduzieren möchte und der Empfänger mit dem Integer ohne Verzögerung gleich alles ausführt.
Sende ich die UDP einzeln, merkt man eine höhere Verzögerung am Empfänger.

Daher möchte ich einfach 50ms warten, und dann alles senden, was bis dato eben schon da ist ... wenn danach neue Daten kommen, beginnt das Spiel von neuem.
 

Thallius

Top Contributor
Wäre es da nicht einfacher du sendest alle 50ms egal ob sich was geändert hat oder nicht? Was macht der Empfänger denn damit, dass er das Ergebnis 20x pro Sekunde braucht?
 

Fohnbit

Top Contributor
Das geht leider nicht, da das zuviel Buslast wäre und unnötig. Außerdem kann am Empfänger ebenso geschaltet werden (temporär) und würde die Manuelle bedienung überschreiben.

Ich denk ich erkläre es nochmal:
Der Empfänger ist ein Schaltausgang mit 16 Kanälen (ein/aus)

Wenn im ungünstigsten Falls alle 16 Kanäle eingeschaltet werden sollen, erhalte ich diese 16 Befehle einzeln. Es wird jeweils eine Methode getriggert mit dem Boolean Wert.

Ich würde also 16x den Boolean Wert per SNMP an dem Empfänger senden, damit dort die 16 Ausgänge einschalten.
Das ergibt eine sichtbare Verzögerung von etwa 1 Sekunde, bis Java alle gesendet und der Empfänger alle 16 SNMP Befehle ausgeführt hat.

"Schöner" ist es, wenn ich einen einzelnen Integer Wert an den Empfänger sende. Dieser eine Wert beinhaltet den Status aller 16 Ausgänge (Bitweise) und es werden gleich alle ohne Verzögerung geschaltet.

Damit ich nicht zu viele Integer Werte sende, warte ich einfach einige Millisekunden wenn ein neuer Boolean Wert ankommt. Eventuell kommen ja noch andere (100ms wären wohl auch denkbar).

Daher das Verzögerte senden, wenn sich der Integer ändert.
Ich bin mir ziemlich sicher das mein Code blockiert und daher Befehle nicht weitergesendet werden.

Könnte man die 16 einzelnen Befehle in eine Queue packen und diese beim ersten neuen Wert abarbeiten?
 

Fohnbit

Top Contributor
Ich habe mal etwas versucht:

Die Main Klasse:
Java:
protected BlockingQueue<Channel> queue = new ArrayBlockingQueue<Channel>(1024);

    public void init() {
        Consumer consumer = new Consumer(queue);
        new Thread(consumer).start();
    }

public void onChannel1(boolean value) {
        if (running)
        Channel channel = new Channel();
        channel.channel = 1;
        channel.value = value;

        try {
            queue.put(channel);
        } catch (InterruptedException e) {
                e.printStackTrace();
        }
    }
onChannelx eben für die anderen 15 auch

Der Consumer, der dann später auch die UDP Daten sendet:
Java:
import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable {

    protected BlockingQueue<Channel> queue = null;

    public Consumer(BlockingQueue<Channel> queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            while (true) {
                Channel channel = queue.take();
                System.out.println("Kanal: " + channel.channel + " Wert: "
                        + channel.value);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Die Channel Klasse:
Java:
public class Channel {
    public int channel;
    public boolean value;
}

Was ich mich nun frage:
Blockiert die Main Klasse, wenn es etwas in die Queue legen möchte, wenn die Queue gerade vom Consumer im Loop abgefragt wird?

Wäre das ein Ansatz um die Main Klasse "Blockierfrei" zu bekommen?

Danke!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Wo kommt der Wert der Variable her ? Allgemeine Java-Themen 6
M Parallele Programmierung: volatile Variable nimmt ungewöhnlichen Wert an Allgemeine Java-Themen 3
iB0T Variable Wert ausrauchen Allgemeine Java-Themen 3
J Was ist schneller? Neue Variable oder neuer Wert speziell int Allgemeine Java-Themen 3
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Wie kann man herausfinden, wo der Wert herkommt ? Allgemeine Java-Themen 13
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S Wert zuweisung Allgemeine Java-Themen 1
Alex_99 Rechner: Wert zwischenspeichern und bei Bedarf mit Ihm weiterrechnen? Allgemeine Java-Themen 6
Tiago1234 CellReference cr = new CellReference("") gibt den falschen Wert zurück Allgemeine Java-Themen 49
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
L String zu repräsentativen Wert Allgemeine Java-Themen 0
S Drools: Zählen wie oft ein Wert vorkommt Allgemeine Java-Themen 1
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
T Wert an laufenden Java-Prozess übergeben Allgemeine Java-Themen 10
A Variablen Funktion übergibt den Wert nicht Allgemeine Java-Themen 13
P JSpinner gibt leeren Wert zurück Allgemeine Java-Themen 5
KeexZDeveoper Nächstgelegenden Wert ermitteln Allgemeine Java-Themen 5
C Variablen Variablen mit unendlichem Wert Allgemeine Java-Themen 22
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
T Array - Wert am nächsten zur vollen Sekunde Allgemeine Java-Themen 20
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Wert ändert sich nicht Allgemeine Java-Themen 12
E JavaFX String-Wert geht "verloren" - ratlos Allgemeine Java-Themen 2
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
R Int Wert im Dialogfeld ändern Allgemeine Java-Themen 4
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
O log4j, Problem bei Ausgabe null-Wert Allgemeine Java-Themen 0
H Bestimmten Wert aus String parsen Allgemeine Java-Themen 7
M HashMaps: Wert erweitern Allgemeine Java-Themen 3
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
T Datentypen ArrayUtils.indexOf( ... ) liefert -1 obwohl Wert scheinbar enthalten ist Allgemeine Java-Themen 15
H Speziellen Wert aus String filtern Allgemeine Java-Themen 4
M JExcel Wert aus Zelle übergeben/ausgeben Allgemeine Java-Themen 2
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
G Z Wert - 3 Dimensionaler Punkt Allgemeine Java-Themen 13
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
C .Ini-Datei Wert Änderungen werden nicht angenommen Allgemeine Java-Themen 3
J String mit "," in Double Wert konvertieren Allgemeine Java-Themen 7
A nur einen Wert aus einer .conf lesen und erneuern Allgemeine Java-Themen 3
I getResponseCode(); returnt einen falschen Wert? Allgemeine Java-Themen 7
N Applet Apache Poi Wert einer Formel ausgeben Allgemeine Java-Themen 5
G Input/Output Manuelle Änderung von Wert in Swing Komponente bemerken! Allgemeine Java-Themen 2
S Newton-Verfahren liefert nur 1 Wert Allgemeine Java-Themen 3
E Wert von enum zur Laufzeit festlegen. Allgemeine Java-Themen 5
E Wert in andere Klasse übernehmen Allgemeine Java-Themen 4
X this.val$WERT Was ist den das? Allgemeine Java-Themen 2
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
S Daten in Array als INT-Wert einlesen - jetzt als csv Datei Allgemeine Java-Themen 5
T OLE-Automation mit Excel (Wert übergabe) Allgemeine Java-Themen 1
Benji0815 Wert in GUI aktualisieren, Beobachter Allgemeine Java-Themen 9
O Hash Wert von Passwörter erstellen (SHA) Allgemeine Java-Themen 9
G Double Wert über OutputStream verschicken Allgemeine Java-Themen 2
S Methode übergibt immer den gleichen Wert Allgemeine Java-Themen 21
M Bit Wert umdrehen Allgemeine Java-Themen 5
J ArrayList aus Point-Objekten nach dem x-Wert ordnen Allgemeine Java-Themen 2
B Wert mit Adresse auslesen Allgemeine Java-Themen 11
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
M Ein Array-Wert soll sich verändern, aber 2 tun es? Allgemeine Java-Themen 7
S Prüfen auf Hex-Wert fester Länge! Allgemeine Java-Themen 5
G transientes Objekt mit Wert initialisieren? Allgemeine Java-Themen 7
reibi double-Wert auf 2 Stellen nach dem Komma abschneiden Allgemeine Java-Themen 6
S CRC wert berechnen ergibt 0 ? Allgemeine Java-Themen 9
MQue Float- Wert formatieren Allgemeine Java-Themen 8
A Private-Wert eines Objekts auslesen Allgemeine Java-Themen 9
R Wert von einer Klasse in eine andere bekommen Allgemeine Java-Themen 6
J Integer Array Wert vorhanden? Allgemeine Java-Themen 6
N Wert in ArrayList ändert sich ohne wissentliches zutun Allgemeine Java-Themen 6
O System.nanoTime() einheitlichen Wert auf mehreren Rechnern? Allgemeine Java-Themen 9
H JTable Wert verändern Allgemeine Java-Themen 3
S den zweit niedrigsten wert in einem array berechnen Allgemeine Java-Themen 2
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
J Vector - Wert ersetzen Allgemeine Java-Themen 14
H Zugriff auf Wert einer Umgebungsvariablen Allgemeine Java-Themen 2
H JSF - Wert an ein managed bean übergeben Allgemeine Java-Themen 2
H boolean wert ändern Allgemeine Java-Themen 2
R Wert in Hashtable ändern (Key ändern, Value bleibt) Allgemeine Java-Themen 3
G Wandeln von Char Wert in Zeichen? Allgemeine Java-Themen 2
B Java Klasse muß in Terminal einen Wert zurückgeben. Allgemeine Java-Themen 3
R ascii-wert zuweisung Allgemeine Java-Themen 4
B Wert zuweisen bei deklaration? Allgemeine Java-Themen 9
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
A Float-Wert auf 2 Stellen nach den Komma runden ? Allgemeine Java-Themen 2
B Double-Wert aus einem HexString erstellen. Allgemeine Java-Themen 11
B Wie bekomme ich den Wert aus der For-Schleife? Allgemeine Java-Themen 5
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
H lokale Variable bei Optional verwenden Allgemeine Java-Themen 11
A Variable in if initialisieren Allgemeine Java-Themen 23
S Variable als Objekt Name Allgemeine Java-Themen 3
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben