Inter-Thread-Kommunikation

Status
Nicht offen für weitere Antworten.
W

Wolfram

Gast
2 Threads A und B. A kommt von Main(), B extends Thread und wurde ge-start()-et.

Die sollen miteinander reden, und während der andere was tut, jeweils blockieren. A soll einen Wert an B schicken, B damit eine Berechnung anstellen, und das Ergebnis an A zurück schicken. Danach erst soll tatsächlich parallel gearbeitet werden, aber trotzdem noch miteinder kommuniziert werden, was ich im Beispiel nicht dargestellt habe.

Also nochmal kurz:

B soll nach dem Start warten, bis etwas kommt, und dann erst losrechnen.
A soll auf das Ergebnis warten, bevor weiter gemacht wird.

Die unten gepastete Lösung tut, was ich erwarte, hat aber Warzen und Pickel bekommen, und ich denke, dass ich daher grob was falsch gemacht haben muss. Die Warzen und Pickel wären:

* Ein notify() muss in ein synchronized auf dem Objekt eingeklammert werden, das den Thread darstellt, der die Nachricht erhält. Ein wait() entsprechend in ein synchronized auf dem eigenen Objekt. Das sieht richtig aus, jedoch ist es nicht möglich, auf irgendwas anderem zu synchronized-en, man bekommt sonst eine IllegalMonitorStateException. Man muss auf dem Objekt synchronisieren, auf dem ge-wait()-et wird. (1) Ich habe keinerlei Doku gefunden, die das hergibt. Ich erwarte eigentlich, auf new Object() synchronisieren zu können. (2) Wenn das zwingend so wäre, könnte wait() das schließlich aus selbst tun.

* while(!t.initialized()); ist, um zu verhindern, dass Thread A das notify() los schickt, bevor der andere überhaupt die Chance hatte, zu wait()-en. Das ist eklig und tut nur in 99.9999% der Fälle, was man denkt: Zwischen init=true und wait() kann der thread ja schließlich unterbrochen werden.

Wer also weiß den einzig wahren Weg, das zu implementieren?

Grüße,
Wolfram

Code:
package testmultithread;

class thethread extends Thread {
    
    String msgIn=null;
    String msgOut=null;

    Object other=null;
    boolean init=false;
            
    boolean msgTerminate=false;
    
    // Communication
    public void msgSend(String m)  { msgIn=m; }    
    public String getMsg()  { return msgOut; }
    public void terminate()  { msgTerminate = true; }

    public boolean initialized()  { return init; }

    // Constructor: need to know the caller (to notify() it)
    thethread(Object other) { 
        this.other=other;
    }
    
    @Override
    public void run() {
        while (!msgTerminate) {
            
            System.out.println("thethread: wait");
            init=true;
            
            try {
                synchronized(this) {
                    wait();
                }
            } catch (InterruptedException e) {}

            if (msgIn!=null) {
                System.out.println(msgIn);
                msgIn=null;
                msgOut="msgOut";
                System.out.println("thethread: notify");
                synchronized(other) {
                    other.notify();
                }
            }
        }
    }
}


class OtherMain {
    
    public void go() {
        thethread t = new thethread(this);

        t.start();

        while (!t.initialized());

        t.msgSend("Yo");
        System.out.println("Main: notify");

        synchronized(t) {
            t.notify();
        }
        
        synchronized(this) {
            try {
                System.out.println("Main: wait");
                wait();
            } catch (InterruptedException e) {}
        }
        
        System.out.println(t.getMsg());
        
        t.terminate();
        synchronized(t) {
            t.notify();
        }
    }
}

public class Main {
    
    public static void main(String[] args) {
        new OtherMain().go();
    }

}
[/code]
 

Pappenheimer++

Bekanntes Mitglied
Für deine Zwecke wäre u.U. java.util.concurrent.LinkedBlockingQueue angebracht. Da kannst du einfach eine dequeende Methode aufrufen, die solange blockiert, bis etwas zum Entnehmen vorhanden ist. Da kannst du ja den ersten Aufruf als Flag nehmen, um anzuzeigen, wann der Thread "starten darf" und ansonsten eben deine "normale" Kommunikation darüber regeln.
 
S

SlaterB

Gast
> Zwischen init=true und wait() kann der thread ja schließlich unterbrochen werden.

wenn es aber in der Form
synchronized(this) {
init=true;
wait();
}
steht, dann stört das Unterbrechen nicht ;)

--------

> while(!t.initialized()); [..] ist eklig

falls du das generell meinst, dann stimme ich dir zu,
lasse doch die Threads in der richtigen Reihenfolge starten,
oder warte an einem dritten Objekt oder setze wenigesten Thread.sleep(10) in die Schleife
 
W

Wolfram

Gast
Pappenheimer++ hat gesagt.:
Für deine Zwecke wäre u.U. java.util.concurrent.LinkedBlockingQueue angebracht. Da kannst du einfach eine dequeende Methode aufrufen, die solange blockiert, bis etwas zum Entnehmen vorhanden ist. Da kannst du ja den ersten Aufruf als Flag nehmen, um anzuzeigen, wann der Thread "starten darf" und ansonsten eben deine "normale" Kommunikation darüber regeln.

Yup, das geht *viel* besser. Bevor mir das Gehirn 'Mars Attacks!'-mäßig platzt, wenn ich versuche, die Anforderung auf kritische Abschnitte abzubilden, meine ich. Danke!

Code:
package javaapplication1;

import java.util.concurrent.LinkedBlockingQueue;


// Definition für die Kommandoliste.
class ITCCommand {

    static final int TERMINATE = 0;
    static final int MSG = 1;

    public int cmdnr;
    public String param;

    ITCCommand(int cmdnr, String param) {
        this.cmdnr = cmdnr;
        this.param = param;
    }
}

class thethread extends Thread {

    OtherMain other;
    
    LinkedBlockingQueue<ITCCommand> commands =
            new LinkedBlockingQueue<ITCCommand>();

    thethread(OtherMain other) {
        this.other = other;
    }
    
    // Kommando an diesen Thread schicken.
    public void command(ITCCommand cmd) {
        try {
            commands.put(cmd);
        } catch (InterruptedException e) {}
    }

    @Override
    public void run() {

        // Schleife zm Abarbeiten von Kommandos
        out:
        while (true) {
            ITCCommand cmd=null;

            try {
                cmd = commands.take();  // auf Kommandos warten
            } catch (InterruptedException e) {}

            switch (cmd.cmdnr) {
                case ITCCommand.TERMINATE:
                    break out;
                case ITCCommand.MSG:  // Ausgeben und Kommando zurück schicken
                    System.out.println(cmd.param);
                    cmd = new ITCCommand(ITCCommand.MSG, "Man");
                    other.command(cmd);
                    break;
            }
        }
    }
}

class OtherMain {

    LinkedBlockingQueue<ITCCommand> commands =
            new LinkedBlockingQueue<ITCCommand>();
    
    // Kommando an diesen Thread senden.
    public void command(ITCCommand cmd) {
        try {
            commands.put(cmd);
        } catch (InterruptedException e) {}
    }
    
    public void go() {
        ITCCommand cmd = null;
        
        // neuer thread, gleich ein Kommando senden
        thethread t = new thethread(this);
        t.start();
        t.command(new ITCCommand(ITCCommand.MSG, "Yo"));
        
        // auf die Antwort warten und ausgeben
        try {
            cmd = commands.take();   // blockiert
        } catch (InterruptedException e) {}
        System.out.println(cmd.param);

        // anderen Thread auch beenden
        t.command(new ITCCommand(ITCCommand.TERMINATE, ""));
    }
}

public class Main {

    public static void main(String[] args) {
        new OtherMain().go();
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
L Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben