Datenverteilung: Mehrere Threads verwenden?

Status
Nicht offen für weitere Antworten.

Antimon

Mitglied
Hallo zusammen,

folgendes Problem bewegt mich grade: Von einem Bussystem (CAN-Bus) bekomme ich Datenpakete über eine (serielle) Schnittstelle in den PC - diese möchte ich weiterverarbeiten. Im Bussystem sind mehrere Teilnehmer, die auch in meiner Software virtuell abgebildet sind. Kommen vom Bus Daten, werden die von den virtuellen Teilnehmern verarbeitet.

Momentan läuft es so ab: Ein Datenpaket kommt herein, es wird herausgesucht zu welchem der Teilnehmer es gehört und wird diesem zugestellt. Dieser kann dann die Daten analysieren und weiterverarbeiten, was je nach Dateninhalt auch etwas länger dauern kann. Da vom Bus schon mal 1000 Pakete in der Sekunde kommen können, kann es passieren dass es dauert bis die neuen Pakete weitergeleitet werden, da die ganze Geschichte einigermaßen zeitkritisch ist, kommt das dann hin- und wieder zu Problemen.

Um das Ganze zu optimieren habe ich mir überlegt, die Pakete an die virtuellen Teilnehmer jeweils in einem Thread weiterzuschicken, wenn dann bei einem die Verarbeitung etwas länger dauert (z.B. weil in der Zwischenzeit ein Dateizugriff geschieht, der etwas dauert), können die anderen Pakete parallel weiterverarbeitet werden.

Das ist zwar an sich schön, aber macht es nicht einfacher, denn die Threads müssen ja vielleicht auch synchronisiert werden, aber das wäre schon machbar. Was mich aber noch mehr stört, ist dass wegen jeder Nachricht ein Thread ausgeführt wird - wie ist das von der Performance her? Klar kann ich einen Thread Pool verwenden, aber jeder Thread muss doch initialisiert werden, könnte das den Performancegewinn wieder beeinträchtigen? Im dümmsten Fall könnten ja pro Sekunde 1000 Threads gestartet / beendet werden, ist das zu heftig? Wäre es dann doch effizienter, die Nachrichten in einem Thread nacheinander abarbeiten zu lassen und dann lieber die Abarbeitung irgendwie zu optimieren?
 
T

tuxedo

Gast
Du kannst einen Cached ThreadPool verwenden. Da wird dann selbstätig entschieden wieviele Threads parallel laufen. Laufen die Threads für 60sek. leer, werden sie aufgeräumt.

Du kannst aber auch einen "Fixed Thread Pool" verwenden. Allerdings würde ich da keine 1000 Threads reinpacken. Eher "Anzahl CPU Kerne * 2" Threads. Wenn alle Threads beschäftigt sind werden neue Aufgaben einfach gequeued und ausgeführt wenn ein Thread wieder frei wird.

Musst ausprobieren was performanter ist. Vllt. machst du's am besten konfigurierbar. Dann kann man später noch wechseln wenns nötig ist.

- Alex
 
G

Gast2

Gast
Moin,

tuxedo hat schon recht - um eine Queue kommst Du nicht herum

Klasse Bus nimmt Daten vom Bus entgegen ... entscheidet welcher Teilnehmer die Daten dann weiter gereicht bekommt ... das wird dann beim entsprechenden Teilnehmer in einen Queue geschoben (Synchronisation könnte vorteilhaft sein) ... jeder Teilnehmer schaut in einem eigenem Thread nach ob etwas im Queue steckt ... wenn ja, wird entsprechend verarbeitet

das Kritische sind die Threads ... selbst 1000 Threads halte ich für viel (und ich schmeise gerne mit Threads um mich) ... daher würde ich in jedem Teilnehmer mit einem Busy-Wait und einem Sleep() die Queue überwachen ... und auch in diesem Thread würde ich dann die Daten abarbeiten ... das Ganze hat den Zweifelhaften Vorteil das der Queue voll läuft, wenn zu viele Daten ankommen ... spart dir aber auch das Verwalten und Instanzieren von Threads ... letzteres kostet viel Zeit und kannst Du mittels Thread-Pool umgehen ... die Verwaltung bleibt aber (und damit Rechenzeit)

am besten eine abstrakte Klasse Daten erstellen, welche die Daten in Rohform (also Byte-Array) entgegen nimmt ... dann sind alle Queue's für die Teilnehmer gleich ... die erbende Klasse kann dann ja entsprechende Methoden bereitstellen um mit den Daten arbeiten zu können

hand, mogel
 

Antimon

Mitglied
Hmm warum bin ich da nicht gleich draufgekommen - danke fürs Augen öffnen, Jungs.

Bisher bin ich davon ausgegangen, dass die Nachrichten in einem Thread verteilt und dort auch bearbeitet werden - aber eigentlich kann jeder Empfänger seine eigene Queue haben und die abarbeiten... also Nachricht kommt vom Bus, wird im Empfängerthread entgegengenommen und in die Teilnehmer-Queues eingereiht - dann werden die über ein notify() informiert, dass was da ist und können das abarbeiten. Und die Threads der Teilnehmer könnte man ja als CachedThreadPool ausführen oder? Bzw. wenn die Threads nach 60 Sekunden aufgeräumt (=beendet?) werden, vielleicht eher nicht so toll, ich will ja eigentlich dass die wieder anlaufen, wenn nach 5 Minuten wieder was reinkommt...

Was ist dann für eine Strategie bei der Datenverteilung sinnvoll? Ich kenne die Absenderadresse vom Bus und kann die Nachricht dann eindeutig einem Empfänger zuordnen, deswegen würde ich behaupten, ist es sinnvoll, wenn ich erst den Empfänger raussuche und dann die Nachricht zustelle. Oder ist es doch besser ich arbeite mit Listenern, jeder Empfänger ist ein Listener und prüft dann selbst ob die Nachricht für ihn ist oder nicht?

Dumm ist halt, dass es Nachrichten gibt, die allen Teilnehmern zugestellt werden müssen, aber das wär von der Effizient mit beiden Methoden gleich oder?
 
G

Gast2

Gast
Was ist dann für eine Strategie bei der Datenverteilung sinnvoll? Ich kenne die Absenderadresse vom Bus und kann die Nachricht dann eindeutig einem Empfänger zuordnen, deswegen würde ich behaupten, ist es sinnvoll, wenn ich erst den Empfänger raussuche und dann die Nachricht zustelle. Oder ist es doch besser ich arbeite mit Listenern, jeder Empfänger ist ein Listener und prüft dann selbst ob die Nachricht für ihn ist oder nicht?
von der Wartbarkeit her ist die Listenervariante besser ... zum Einem ersparst Du Dir das notify - da das im Listener (mehr oder weniger) mit drinnen ist ... zum Anderem ist das leichter Erweiterbar ... Du brauchst nur einen neuen Teilnehmer zu implementieren der mit dem Listener umgehen muss ... dadurch wird dem Empfänger kleiner und überschaubarer

Dumm ist halt, dass es Nachrichten gibt, die allen Teilnehmern zugestellt werden müssen, aber das wär von der Effizient mit beiden Methoden gleich oder?
Effizienz wäre in beiden Fällen ungefähr gleich
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Aruetiise Socket Mehrere Clients Netzwerkprogrammierung 4
E Mehrere Sockets Netzwerkprogrammierung 2
C Mehrere Spielewelten im Multiplayer Netzwerkprogrammierung 2
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
Creylon Socket Mehrere gleichzeitig eingehende Nachrichten Netzwerkprogrammierung 8
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
Z Socket [Chatprogramm] Mehrere Clients an einen Server Netzwerkprogrammierung 10
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
G Socket Mehrere Clientanmeldungen am Server Netzwerkprogrammierung 13
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
M Jetty Konfiguration mehrere Handler? Netzwerkprogrammierung 2
F UDP Server - mehrere Pakete auf einmal Netzwerkprogrammierung 12
A Mehrere gleich Packete behandeln Netzwerkprogrammierung 4
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
R mehrere MySQL-Zugriffe Netzwerkprogrammierung 3
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
S Mehrere Attachments mit JavaMail API auslesen Netzwerkprogrammierung 3
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
T Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem Netzwerkprogrammierung 3
W Bestimmt IP Adresse verwenden wenn man mehrere hat Netzwerkprogrammierung 5
D Clients sollen mehrere Sessions starten Netzwerkprogrammierung 11
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
L mehrere Streams über einen Socket? Netzwerkprogrammierung 8
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
E Mehrere / bestimmte Netzwerkkarten ansteuern Netzwerkprogrammierung 10
F Mehrere Attachments mit JavaMail API Netzwerkprogrammierung 2
G Proxy und mehrere Verbindungen Netzwerkprogrammierung 4
G Mehrere SSL Verbindungen Netzwerkprogrammierung 2
A Mit Client auf mehrere Server zugreifen Netzwerkprogrammierung 5
M Mehrere Ports gleichzeitig abhören Netzwerkprogrammierung 5
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
G Server an mehrere Clients Netzwerkprogrammierung 15
L JavaMail: Automatisches Email Versand (mehrere Empfänger) Netzwerkprogrammierung 4
U Einen HandlerThread, der mehrere Verbindungen verwaltet? Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18

Ähnliche Java Themen

Neue Themen


Oben