Variablen in Threads ansprechen

BigFish

Mitglied
Hallo Ihr,

ich habe eine ganz allgemeine Frage, die ich jetzt erstmal in der Theorie erläutern will. Sollte es unverständlich sein, schreibe ich dazu gerne noch ein Code-Beispiel.

Ausgangssituation: Ich habe ein Programm zur Server-Client-Kommunikation geschrieben.
Es verwendet eine Thread-sichere Blocking Queue und arbeitet auf mehreren Threads.
Bspw. auf der Serverseite gibt es einen Server-Thread, der auf Client-Verbindungen wartet.
Verbindet sich ein Client, erstellt er einen "Empfänger" und einen "Sender" Thread.
Diesen wird jeweils eine "sendeq" und eine "listenq" übergeben.
Möchte ich nun etwas verschicken, packt der Server einfach ein Objekt in die "sendeq", der Rest passiert dann von selbst über einen ObjectStream.

Problem: Nun habe ich aber nur einen Client implementiert und möchte das Ganze etwas ausweiten auf mehrere. Dazu habe ich mir überlegt, dass bei der Verbindung eines Clients einfach zwei weitere Threads erzeugt werden, genau wie oben. Also "Empfänger2" "Sender2" oder so.
Denen wird dann einfach wieder die BlockingQueue übergeben. Und hier komme ich zu meinen Fragen.

Fragen:

(1) Ist es möglich die gleiche (Thread-sichere) Variable mehreren Threads zu übergeben? Und wenn ja, wie spreche ich dann beispielsweise nur die "sendeq" des zweiten Threads an?
Ich stelle mir das so wie bei Klassen vor: Empfaenger2.sendeq.add(Nachricht)
(2) Ist es überhaupt möglich auf einem Socket mehrere Input- und Outputstreams zu erstellen?
(3) Gäbe es prinzipiell eine Möglichkeit die Threads dynamisch zu erstellen, so dass das Ganze beliebig erweiterbar ist oder muss die Anzahl der möglichen Clients vorher feststehen?
Ich denke momentan daran, dass bei jeder weiteren Verbindung einfach der nächste Thread gestartet wird und durch eine Runtime-Variable vorher feststeht wieviele es geben kann.
Die heißen dann halt "Empfaenger1" "Empfaenger2" usw...


Vielen Dank für hoffentlich viele Antworten =)
 
Ok ich reduziere es etwas:

Wenn ich mehreren Threads die gleiche Variable übergebe, also eine Queue, wird diese dann jedesmal kopiert oder schreiben alle Threads auf der Selben?

Weiß da vielleicht jemand was?
 
eins kann man dir für alle Programmiersprachen und alle Computer der Welt leicht beantworten:
durch ausprobieren könntest du die Frage selber beantworten
 
Wenn du allen Threads die gleiche übergibst, schreiben sie auf die gleiche. Wenn du allen die selbe übergibst, schreiben sie auf die selbe. Du solltest dir über den Unterschied im klaren sein. Aber man weiß ja, was gemeint ist:
Java:
class Client
{
    private Queue q;
    public void setQueue(Queue q) { this.q = q; }
}

void init()
{
    Queue q = new Queue();
    Client c0 = new Client();
    Client c1 = new Client();

    c0.setQueue(q);
    c1.setQueue(1);

}

Dann haben beide Clients dieSELBE Queue.
 
Ah ok ich verstehe. Die Frage ist also, ob ich eine neue Queue im Thread instanziiere (dann ist es die GLEICHE) oder ob ich jedem Thread die zuvor instanziierte Queue übergebe (dann ist es die SELBE).
 
Jein, man könnte auch zweimal die gleiche übergeben
Code:
Queue q0 = new Queue();
c0.setQueue(q0);

Queue q1 = new Queue();
c1.setQueue(q1);
Aber die sind natürlich nur so lange gleich, wie sie die gleichen Elemente enthalten (während dieselben ja immer dieselben Elemente enthalten, weil es ja (ein-und-)dieselbe Queue ist.)
 

Neue Themen


Zurück
Oben