Wieviele Threads sind sinnvoll?

W

White_Fox

Top Contributor
Ein schönes Wochenende allerseits.

Ich hätte mal zwei Fragen zu Threads:
  1. Wieviele parallele Threads erachtet ihr für sinnvoll?
  2. Ich hätte zu 1. gesagt: ein Thread je Rechenkern, wenn diese Hyperthreading unterstützen auch zwei. Das bringt mich zu der Frage: Wie kann ich in einem Javaprogramm herausfinden, wieviele Rechenkerne ich zur Verfügung habe?

Gruß
White_Fox
 
H

httpdigest

Top Contributor
Das hängt hauptsächlich mal von der zu lösenden Aufgabe und deren Parallelisierbarkeit und der arithmetischen Dichte (Prozessorzyklen pro I/O) der Aufgabe ab. Wenn du zu nahezu 100% auf I/O wartest und du kein non-blocking Modell fährst, dann können auch 100 Threads was bringen.
Z.B. ist das der Fall bei einem Servlet-Container wie etwa Tomcat, die nach dem Thread-pro-Request-Modell arbeiten und somit schon nahezu zu 100% I/O-bound und nicht compute-bound sind. Wenn deine Aufgabe compute-bound ist (du also eine hohe arithmetische Dichte, also viele nutzbare Prozessorzyklen pro I/O) hast, dann bringen nur soviele Threads etwas wie viele Kerne du hast.
Zu der Frage, wie man die Anzahl logischer Prozessoren findet: https://stackoverflow.com/questions/4759570/finding-number-of-cores-in-java
 
J

JustNobody

Top Contributor
Ich denke, dass in https://stackoverflow.com/questions...umber-of-threads-in-parallel-programs-in-java eine sehr gute Zusammenfassung in der Antwort von emon ist.

Die Frage ist aber, in wie weit es notwendig ist, sowas selbst zu schreiben. Gewisse Dinge sind ja bereits implementiert.

So wäre z.B. denkbar, die zu verarbeitenden Daten über einen parallelen Stream zu bearbeiten. Wobei parallele Streams auch nur auf ForkJoinPool.commonPool zurückgreifen. Und der Pool hat nach meinem Wissen (habe ich jetzt nicht nachgeschlagen) 1 Thread weniger als eben "Processors" zur Verfügung stehen. (Das sind logische CPUs, also auch incl. Hyper Threading).

Sollte ich mich hier irren, so wird hoffentlich ein Experte mich korrigieren können.

Und ganz Wichtig: Den commonPool nicht mit Threads belegen, die blockieren. Der wird halt für gewisse Verarbeitungen benutzt und den würde ich in der Regel nicht blockieren.
 
W

White_Fox

Top Contributor
Ich werde mir mal parallele Streams anschauen, aber ich denke nicht daß ich da auf viel Fertiges werde zurückgreifen können. Beim Serialisieren geht es darum, alle Descriptorobjekte in Bytearrays umzuwandeln, das macht die meiste Arbeit aus. Danach alle Bytearrays zusammenzupappen ist rasch erledigt.
Aber das Serialisieren ist auch ein eher nachrangiger Aspekt:

Der mit richtig großem Abstand meiste Aufwand kommt beim Zusammenbauen der Objete zu stande (da halt viele Objekte instanziert), ich weiß aber nicht ob ich da nur mit parallelen Threads viel raushole. Wahrscheinlich werde ich mich auch noch damit beschäftigen müssen, wie ich Speicher im vorraus alloziiere, falls das in Java überhaupt geht.

Und auch das Analysieren von Objekten ist - wenn auch geringfügig - zeitintensiver als der Serialisierungskram. Das werde ich vllt. als erstes Multithreaden.

Ich habe mal einen Test geschrieben und die Zeit gestoppt, welcher Vorgang wie lange dauert. Daher kommt Serialisierung/Deserialisierung erst ganz am Ende dran. :)
 
J

JustNobody

Top Contributor
Die parallelen Streams waren nur eine Option, die ich genannt habe, weil ich gerne bei diversen Aufgaben Streams nutze.

Aber die parallelen Streams nutzen halt den commonPool von ForkJoinPool (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html)

Die Nutzung zeigt z.B. etwas https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html, aber die Dokumentation enthält auch ThreadPools und so - evtl. schaust du da einfach etwas durch die Topics im Seitenmenü.

Oder weitere Links (gerade weil manche die Oracle Dokumentation als zu kurz oder so empfinden):
Oder YouTube (nicht wirklich geprüft - nur vom Titel her halt gefunden):

Vielleicht ist da einfach etwas für Dich dabei, das Dir die Arbeit / Umstellung erleichtert (So diese Ideen in Deinen Augen zielführend sind! Da wird auch nichts magisches gemacht - du kannst also auch die Anzahl der Prozessoren ermitteln ( Runtime.getRuntime().availableProcessors(); ) und dann einfache Threads selbst erstellen und verwalten oder so. Es gibt bestimmt ganz viele Möglichkeiten, die alle ihre Berechtigung haben. Ich wollte halt nur die Idee aufbringen, dass die manuelle Begrenzung an Threads ggf. nicht notwendig ist.)
 
W

White_Fox

Top Contributor
Ich stöber das mal durch...ich lerne ja gerne dazu. :)

Und vielleicht stell ich das auch mal etwas detaillierter hier rein - die nächste Revision werde ich hier jedenfalls wieder zur Begutachtung vorlegen. Mir hat das Feedback und die Hilfestellungen hier jedenfalls sehr viel gebracht.
 
L

LimDul

Top Contributor
Grundsätzlich musst du natürlich berücksichtigen, wenn die Threads auf gemeinsamen Objecten/Collections arbeiten, dass der Zugriff da nicht in Probleme läuft. Insbesondere bei Sachen wie: "Prüfe ob schon ein Eintrag vorhanden, wenn nein füge eine hinzu" läuft man im Multithreading leicht in häßliche Probleme rein, wenn nicht aufpasst. Entweder hat man Duplikate drin oder baut sich Performance-Probleme, wenn man zu viel synchronized nutzt.
 
W

White_Fox

Top Contributor
Jap, diese Probleme kenne ich aber glücklicherweise schon. :)

Ich hab mal eine Klasse gebaut die mit einer Hardware in "Echtzeit" (Haha, Witz komm raus...) kommunizieren sollte. Da haben insgesamt drei Threads miteinander auf gemeinsamen Daten gewerkelt und an einer Stelle wurde die Zugriffsberechtigung ignoriert, am Ende habe ich per Reflection untersuchen müssen, welcher Thread da aus der Reihe tanzt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
R Wieviele Bytes gesendet Allgemeine Java-Themen 3
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
Fabian321 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
P 4 Threads in einer Methode Allgemeine Java-Themen 2
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
NicoDeluxe Threads und synchronized Allgemeine Java-Themen 9
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
NicoDeluxe Threads und synvhronized Allgemeine Java-Themen 2
S Problem mit Threads Allgemeine Java-Themen 1
W Threads Threads warten lassen Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
M Threads Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
O Threads und If Befehle Allgemeine Java-Themen 7
M Threads Minecraft, MySQL und Threads Allgemeine Java-Themen 12
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
C Threads und Exceptions Allgemeine Java-Themen 7
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
E Threads Sudoku Threads Allgemeine Java-Themen 8
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
Gossi Threads mit unterschiedlichen Aufgaben in einer Klasse? Allgemeine Java-Themen 9
G Threads Ablauf von Threads im Spezialfall Allgemeine Java-Themen 4
V Threads bei quadcore Allgemeine Java-Themen 10
V 1000 Threads oder Iterativ? Allgemeine Java-Themen 11
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
B Threads Game of Life - Threads Allgemeine Java-Themen 49
R Threads Exceptions von Threads abfangen im ThreadPool Allgemeine Java-Themen 5
S Threads Ende sämtlicher Threads abwarten Allgemeine Java-Themen 6
S Frage zu Threads (Sichtbarkeit und Verhalten) Allgemeine Java-Themen 11
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
P Threads- Programming Allgemeine Java-Themen 2
G Threads Klasse Sound und Threads bleiben hängen Allgemeine Java-Themen 4
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
M Threads dauerhafte bewegung mit threads Allgemeine Java-Themen 11
frankred Threads Auf eine Gruppe von Threads warten Allgemeine Java-Themen 11
J Eure Meinung: Threads verwenden, oder nicht? Allgemeine Java-Themen 6
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
O Wie kann ich das Ende eines Threads melden? Allgemeine Java-Themen 7
J Writer und Threads Allgemeine Java-Themen 2
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
E Verständnisfrage bezüglich Threads Allgemeine Java-Themen 4
K Zeitkritische Threads Allgemeine Java-Themen 14
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8
S [THREADS] Thread sinnvoll beenden Allgemeine Java-Themen 2
P Buffer - Consumer Producer - Threads synchronisieren Allgemeine Java-Themen 15
A Threads beschränken Allgemeine Java-Themen 2
P Synchronisierung von Threads Allgemeine Java-Themen 6
M Zahl aktiver Threads einer Gruppe verlässlich abfragen Allgemeine Java-Themen 3
S ThreadPoolExecutor: wie stelle ich fest dass meine Threads im Pool mit ihrer Arbeit fertig sind? Allgemeine Java-Themen 3

Ähnliche Java Themen

Anzeige


Oben