5 Stimmen

Cross thread communication java

Also, ich bin neu bei Java, ich habe ein wenig C-Programmierung gemacht. Ich versuche, ein virtuelles Netzwerk von Knoten zu erstellen, wobei jeder Knoten ein Thread sein müsste. Die Knoten dürfen nur mit ihren Nachbarknoten sprechen. Es wird einen Masterknoten geben, der mit jedem Knoten sprechen kann, aber die Knoten müssten miteinander sprechen, um zum Masterknoten zurückzukehren. Die Nachbarn des Masterknotens können mit dem Masterknoten sprechen.

Ursprünglich wollte ich eine Arrayliste der Knoten behalten, dann wurde mir jedoch klar, dass alle Knoten ihren eigenen Thread haben müssten.

Meine Frage ist, wie übergebe ich Informationen zwischen Threads in Java hin und her. Der Masterknoten muss allen normalen Knoten Positionsinformationen geben können. und die normalen Knoten müssen in der Lage sein, Nachrichten an ihre benachbarten normalen Knoten weiterzugeben?

Hier sind meine Git-Repos, wenn Sie den aktuellen Code sehen möchten.

https://github.com/fieldju/cs372_project

In C habe ich ein Programm erstellt, das Pipes verwendet, damit die Kinder miteinander kommunizieren können, und ein Server, der die Clients verbindet, aber bei diesem Problem müssen die Knoten p2p-Kommunikation haben, da die meisten von ihnen nicht direkt mit dem Masterknoten / Server kommunizieren können


Nur ein Update für alle, die sich das ansehen und die Ergebnisse sehen möchten. Die Knoten laufen und kommunizieren, Sie können sich den Code ansehen unter

https://github.com/fieldju/cs372_project

Ich arbeite immer noch an der Distanzvektor-Sache und ein paar anderen Dingen, aber bis Ende nächster Woche sollte das gesamte Ding fertig sein.

4voto

Manuel Salvadores Punkte 16044

Ursprünglich wollte ich eine Liste der Knoten halten, dann wurde mir jedoch klar, dass alle Knoten einen eigenen Thread benötigen.

Sie können eine Liste von Threads behalten, es würde immer noch eine Thread pro Knoten mit der gleichen logischen Struktur aufrechterhalten.

Wie ​​gebe ich Informationen zwischen Threads in Java zurück und forth?

Wenn Threads im selben Prozess sind, sind Sockets definitiv überflüssig. Ich würde eine oder mehrere ConcurrentLinkedQueue-Instanzen verwenden, um Nachrichten zu senden/empfangen.

Die Anzahl von Instanzen hängt von der Art der Kommunikation ab, die Sie implementieren. Vielleicht eine ConcurrentLinkedQueue pro Knoten, sodass Knoten Nachrichten in Warteschlangen schieben und jeder Knoten weiß, woher er die Nachricht abrufen soll.

Einige Hinweise zur Implementierung

Erstellen Sie eine Klasse, die die Logik zum Weiterleiten von Nachrichten enthält - nennen wir diese Klasse VirtualNetwork. VirtualNetwork behandelt alle Instanzen von ConcurrentLinkedQueue und bietet eine API von Methoden für alle Threads zum Senden/Empfangen von Nachrichten. Machen Sie eine Instanz der Klasse VirtualNetwork für alle Knoten zugänglich - indem Sie beim Thread-Erzeuger eine Referenz darauf übergeben.

Dies ist eine Skizze, wie Ihre Klasse NodeThread aussehen würde. Beachten Sie, dass die Klassen VirtualNetwork und Message Klassen sind, die Sie selbst implementieren müssen.

class NodeThread extends Thread {

    private int knotenId;
    private VirtualNetwork netzwerk;

    public NodeThread(int knotenId, VirtualNetwork netzwerk) {
        this.netzwerk = netzwerk;
        this.knotenId = knotenId;
    }
    public void run() {
        /* wenn Sie senden müssen */
        int knotenEmpfänger = this.knotenId -1; /* Nachbar im Array der Threads */
        Message m = new Message(this.knotenId, knotenEmpfänger);
        m.setInhalt(10);
        netzwerk.send(m);

        /* wenn Sie empfangen müssen */
        Message m = netzwerk.receive(this.knotenId);
        /* Es liegt an Ihnen, ob Sie dies blockierend implementieren oder nicht */
    }
}

1voto

finnw Punkte 46519

Ein einfacher (wenn auch nicht optimaler) Weg zu beginnen ist, für jedes Paar von Threads, die Werte in eine Richtung übergeben müssen, eine BlockingQueue zu erstellen (wenn es bidirektional ist, benötigen Sie doppelt so viele).

0voto

Haphazard Punkte 10802

Sie könnten definitiv Sockets verwenden. Es gibt ein paar Tutorials/Beschreibungen hier und hier. Ihre Beschreibung des Projekts legt nahe, dass ein Client/Server-Setup gut funktionieren würde, da Sie einen zentralen "Master-Knoten" haben. Der Master wird der Server sein und die anderen Threads werden in der Lage sein, sich mit dem Master/Server zu verbinden, um ihre Updates zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X