Multithreading: Wie viele Threads sollte ich erstellen?

Tabkas

Mitglied
Hallo!

List<Klasse> liste

sei gegeben. Für jedes Objekt von Klasse in der Liste soll nun eine bestimmte Aufgabe ausgeführt werden.
Zum Beispiel Email senden, API Aufruf an einen Server, Web-Scraping nach einer URL usw.

Diese Prozesse dauern bei mir meist 30-40min, da die Liste meist lang ist und die Aufgabe auch etwas Zeit kostet.

Meine Idee um das ganze zu beschleunigen:
Ich erstelle mehrere Threads, die alle auf liste zugreifen (threadsicher dann, vlt lieber BlockingQueQue). Wenn eine Aufgabe fertig ist, wird das Objekt aus der Liste entfernt, sodass jede Aufgabe 1x erledigt wird.

Doch wie viele Threads wären hier sinnvoll? Ich habe 4 Kerne.
Wenn ich richtig informiert bin, wären also bis zu 8 Threads gleichzeitig möglich, oder?

Ich würde vermuten, es wäre am besten, 8 Threads zu nutzen, da die Gesamtprozesse wie gesagt meist 30-40min dauern. Der Zusatzaufwand durch Datenaustäusche zwischen Threads, sowie das erstellen der Threads etc. würde doch wohl kaum das durch acht teilen von 40 zunichte machen.

Was meint ihr?
Grüße
 

httpdigest

Top Contributor
Es hängt von der "arithmetic density" (also dem Verhältnis der Zeit, die die CPU tatsächlich Instruktionen ausführt, zur Zeit, die CPU bzw. der Thread mit Warten auf I/O verbringt) deiner Aufgaben ab, wieviele Threads sinnvoll sind. Wenn du hauptsächlich auf I/O wartest, was bei E-Mail Senden, WebService-Aufrufe und Web-Scraping wohl der Fall ist, dann reicht 1 Thread und non-blocking I/O.
 

Tabkas

Mitglied
Ich fürchte ich missverstehe das Warten auf i/o.
Beispiel der E-Mail:
Angenommen ich habe eine Liste von 20.000 Emails und möchte stets denselben Text versenden. Worauf muss da gewartet werden?

Nach dem eine Mail gesendet ist, würde ich diese Mail einfach aus der Liste entfernen lassen vom Thread und so lange warten, bis die Liste leer.

Wieso wäre es langsamer mehrere Threads zu nutzen?


Vielen Dank für die Antwort!
 

httpdigest

Top Contributor
Worauf muss da gewartet werden?

1. SSL/TLS Handshake zwischen Client und Server
2. TCP Acknowledges für jedes versendete Paket
3. Warten, dass der Email/SMTP-Server die E-Mail verarbeitet hat
4. Verbindungsabbau auf beiden Seiten

99.9999% der Zeit, die du "eine E-Mail versendest", wird auf I/O bzw. ein externes System gewartet.

Schau dir z.B. mal diese Library hier an: https://github.com/HubSpot/NioSmtpClient

Da du aber wahrscheinlich noch nie etwas mit Non-Blocking I/O gemacht hast, würde ich in deinem Fall tatsächlich einfach mehrere Threads verwenden. Da die Threads die meiste Zeit nur im Warte-Zustand sein werden, müsste deine Anwendung auch ziemlich linear mit der Anzahl der Threads skalieren.

Wieso wäre es langsamer mehrere Threads zu nutzen?
Ich habe nicht gesagt, dass es mit mehreren Threads langsamer wäre. Ich sagte, dass ein Thread ausreicht, wenn du Non-Blocking I/O nutzen würdest.
 
K

kneitzel

Gast
Wieso wäre es langsamer mehrere Threads zu nutzen?

Der Nachteil bei mehreren Threads sind die sogenannten Context Switche, die notwendig sind. Daher ist es meist nicht ratsam, mit sehr vielen Threads zu arbeiten, da hier die Anzahl der Context Switche sehr hoch wird.

Also bei IO lastigen Aufgaben kann es dann also sehr gut sein, dass man eben keine blocking calls verwendet. Java hat diesbezüglich z.B. in java.nio die Channels geliefert.

Aber da man heute immer mehrere Cores hat (Laptops kann man teilweise vernachlässigen weil es da teilweise nur 2 Cores gibt in Low End Bereich, bei Servern gibt es schon enorme "Monster" a.la. 2 CPUs mit jeweils > 20 physischen Cores und so ...), macht es durchaus Sinn, Arbeit auch etwas auf mehrere Threads aufzuteilen, das ggf. auch dynamisch. Aber das hängt auch immer stark davon ab, ob etwas parallelisierbar ist.
Beispiel wäre z.B.: Wenn du parallel Emails abliefern willst, muss das der Email-Server auch annehmen. Hier gibt es oft entsprechende Beschränkungen, die eine Parallelisierung verhindern oder zumindest einschränken. Also auch wenn es technisch auf Clientebene möglich wäre, mit mehreren Threads per no blocking calls parallel hundert Emails auf einmal an den Server zu geben, wird dies kein Mailserver mitmachen :)

So viel einfach einmal von meiner Seite.
 

Dukel

Top Contributor
Im Zweifel einfach testen / Monitoren.
D.h. Programm laufen lassen und immer die Threads erhöhen und die Zeit messen.
 

Tabkas

Mitglied
Danke für alle Antworten! Ich werde es denke ich demnächst mal testen.

Sollte ich einen Threadpool nutzen oder die Threads einzeln erstellen?

Grüße
 
K

kneitzel

Gast
Wie du Tasks erstellen willst und was du da genau wie verwenden willst, hängt von der Anwendung ab.

ThreadPool macht Sinn, wenn du ständig neue Threads erstellen willst/musst, denn da wird ein Thread sozusagen 'wiederverwendet'. Man spart sich also ggf. etwas Overhead durch ständiges Erstellen und initialisieren von Threads. (Threads sind generell nicht wieder zu verwenden. Das gilt auch für einen Thread Pool. Daher ist das intern etwas anders gelöst, so dass ein Thread nach Beendigung der Aufgabe sich eben nicht beendet sondern wieder als bereitstehender Thread in eine Schlange stellt und sich dann 'blockiert' bis er gebraucht wird. Aber das sind interne Feinheiten....)
 

Tabkas

Mitglied
Übrigens, wen es interessiert: Habe es bei Web-Scraping getestet. 3 Threads waren ca. doppelt so schnell wie 1 Thread. Die Aufgabe insgesamt dauerte vlt eine Minute bei dem schnelleren.

Email und so weiter werde ich auch noch testen.

Grüße
 

mihe7

Top Contributor
3 Threads waren ca. doppelt so schnell wie 1 Thread. Die Aufgabe insgesamt dauerte vlt eine Minute bei dem schnelleren.
Klar, Du nutzt die Latenzzeiten besser aus und kompensierst ggf. zu langsame Übertragungsraten.

Stell Dir mal eine Situation vor, in der es keine Latenzzeiten gibt und die Übertragung auf max. Geschwindigkeit läuft. Dann können weitere Threads (höchstens) nichts bringen, denn schneller als "maximal schnell" geht nicht.

Wenn Du öfter Dateien parallel im Browser heruntergeladen hast, müsstest Du den Effekt kennen: wenn eine Quelle lahm ist, kannst Du einen zweiten Download starten. Wenn die zweite Quelle ebenfalls nicht die schnellste ist, dann erhöhst Du damit den Durchsatz. Was aber, wenn die zweite Quelle sehr schnell ist?

Dazu braucht man die Situation nur einmal umzudrehen: man lädt etwas von einer sehr schnellen Quelle herunter, erreicht also maximale Übertragungsrate. Dann bringt ein zweiter Download nichts. Selbst, wenn sich an den Übertragungszeiten der beiden Dateien separat betrachtet nichts ändert, sorgt der zusätzlich Download nur dafür, dass ggf. beide Dateien erst später vollständig zur Verfügung stehen, selbst wenn die Gesamtzeit kürzer ist als die Summe der Einzelzeiten.

Latenzzeiten gibt es praktisch immer. Neben der Antwortzeit des Servers spielt insbesondere die Größe des TCP Fensters eine Rolle: mehr als die dort angegebenen Bytes können nicht empfangen und gesendet werden, ohne der Gegenstelle Antwort zu geben. bzw. auf diese Antwort zu warten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Multithreading Alphabet Allgemeine Java-Themen 3
J Threads Multithreading Allgemeine Java-Themen 15
K Multithreading plattform übergreifend? Allgemeine Java-Themen 3
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
C Ressourcensparendes Multithreading Allgemeine Java-Themen 3
A Multithreading mit JButtons Allgemeine Java-Themen 5
S Threads Multithreading- langsamer als Singlethreading-Programm Allgemeine Java-Themen 6
D Threads Multithreading Allgemeine Java-Themen 25
A MultiThreading.. Scheduling-Problem? Allgemeine Java-Themen 10
M Multithreading Problem Allgemeine Java-Themen 3
dayaftereh Multithreading Allgemeine Java-Themen 16
E Multithreading and volatile Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
G multithreading, concurrency conveyor belt beispiel Allgemeine Java-Themen 2
A Problem mit Zufallszahlen und Multithreading Allgemeine Java-Themen 14
I Problem mit Multithreading Allgemeine Java-Themen 4
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
C Collection Multithreading? Allgemeine Java-Themen 33
O Multithreading mit Java 5 u den Concurrency APIs Allgemeine Java-Themen 7
O Multithreading und Multiprozessor Allgemeine Java-Themen 4
K Multithreading bei statischen Methoden Allgemeine Java-Themen 2
T ungewöhnliche Exception (Multithreading und JList) Allgemeine Java-Themen 10
K Frage zu ProgressBars, Algorithmen und Multithreading ->F Allgemeine Java-Themen 2
flashfactor Multithreading-Problem Allgemeine Java-Themen 4
A Best Practice Wie viele Referenzen machen Sinn? Weniger ist mehr? Allgemeine Java-Themen 1
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
Tacofan Hangman so viele Labels wie Buchstaben Allgemeine Java-Themen 5
K Variablen Konstruktor, unendlich viele Allgemeine Java-Themen 3
E Beliebig viele Worte Allgemeine Java-Themen 5
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
R Arrayausgabe enthält viele Leerzeichen Allgemeine Java-Themen 4
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
C Threads Verbraucht eine Zeitabfrage viele Rechen-Ressourcen? Allgemeine Java-Themen 8
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
D (Viele) Daten performant speichern und lesen Allgemeine Java-Themen 5
S Viele zip-files zu einem kombinieren..? Allgemeine Java-Themen 3
KrokoDiehl Viele JARs und deren Resourcen Allgemeine Java-Themen 9
S Zu viele Felder. Allgemeine Java-Themen 4
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
O viele Datensätze aus Datenbank - Java Heap Space - Excepion Allgemeine Java-Themen 25
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
T viele Threads Allgemeine Java-Themen 14
T Designfrage: Viele, kleine Objekte Allgemeine Java-Themen 13
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
E Viele if Abfragen auf viele Strings --> Alternative zu if Allgemeine Java-Themen 8
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
K Zu viele Threads -> langsamer angehen. Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
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
x46 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
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

Ähnliche Java Themen

Neue Themen


Oben