Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe ein Programm, dass für jeden CLient einen neuen Thread erstellt. Zur Kommunikation der Threads benutze ich einen Pipe. Wenn ich allerdings etwas in den Pipe schreibe kommt es nur bei dem Thread an, der als ERSTER aus dem Pipe liest, nicht bei allen.
für jeden Client einen eigenen Pipe
(also einer schreibt in 10 Pipes, die anderen 10 hören an ihrem einen Pipe)
oder eine eigene Pipe-Klasse nachbauen, die dieses Verhalten umsetzt,
jedenfalls kan ein normales einfaches Pipe-Objekt doch weder wissen, welche Thread gerade aus ihm liest, noch für jeden dieser Threads die alten Daten merken?
oder ist das das Standard-Vorgehen eines Pipes? das bezweifle ich
Du musst eine Art Zentrale aufbauen, bei der sich die Clients (mit ihren Threads) registieren müssen. Ein Client sendet die Nachricht dann an die Zentrale (quasi so etwas wie ein „Server“), welche diese Nachricht an alle anderen verteilt (ähnlich dem EventDispatcherThread). Das macht man am besten über ein Interface (oder eine abstrakte Klasse), das z. B. folgende Methode von den Clients verlangt:
Code:
public Object recieveMessage();
Die Zentrale benötigt außerdem eine Methode, die ein Client aufruft, wenn er etwas senden will, außerdem sollte eine geschützte Methode existieren, die diese Nachrichten verteilt:
Code:
public void sendMessage(Object msg);
protected void fireMessages();
Diese Trennung ist sinnvoll, wenn z. B. Subklassen dafür sorgen wollen, dass Nachrichten nur minutenweise in Paketen gesendet werden (welche natürlich dann gepuffert werden müssen). In der „Grundausführung“ sollte fireMessages() so implementiert sein, dass die evtl. zuvor in einer Liste gepufferten Nachrichten nacheinander an die (ebenfalls in Listen eingetragenen) registrierten Clients gesendet werden.
ACHTUNG: Die Methoden der Zentrale sollten synchronisiert werden, sonst gibt's böse Überraschungen.
Gibt es eine Möglichkeit, eine Funktion für ALLE Instanzen einer Klasse auszuführen? Also z.B.: Ich habe eine Klasse xy. Von der habe ich eine unbekannte Anzahl Instanzen, und ich möchte, dass bei jeder dieser Instanzen die Funktion ab aufgerufen wird?
Du brauchst wieder die oben genannte Zentrale. Wichtige Neuerung: Alle(!) Konstruktoren der Klasse, die diese Methode enthält, müssen die Zentrale (als Parameter) verlangen, unter der sie sich registrieren lassen müssen! Die Zentrale kann dann diese Methode bei allen registrierten Clients aufrufen. (Evtl. mit final arbeiten, dann kann keine Subklasse der Clients diese so wichtige Methode überschreiben.)
noch ne Idee:
alle Meldungen werden in einem Array/ Liste an zentraler Stelle gespeichert und jeder Thread merkt sich selber die Nummer, die er zuletzt angefragt hat,
so kann jeder Thread im eigenen Tempo nach und nach das Array durchlaufen
Das ginge auch, hat aber zwei entscheidene Nachteile: Die Zentrale müsste sich für jede Nachricht merken, wie viele (bzw. welche) Clients diese Nachricht schon gelesen haben, damit alle Clients von der Nachricht auch etwas abbekommen. Außerdem müssen die Clients, die eine Nachricht senden wollen, warten, falls der Puffer voll ist und nicht geleert werden kann, weil ein Client noch nicht alle Nachrichten empfangen hat.