Parallele Ausführung

Status
Nicht offen für weitere Antworten.

vadimiron

Mitglied
Wie werden die mehreren laufenden Threads auf die Prozessoren / Kerne verteilt?
Wie ich verstehe - wird das durch das OS geregelt.... Kann (und sollte) man dies beeinflussen?
Kann es passieren, dass die mehreren Threads doch an einen Prozessor zugewiesen werden?

Meine Idee war, nur so viel threads erzeugen lassen, wieviel Prozessoren im System vorhanden sind. Alle andere in der Schlange verwalten. Macht das Sinn?? Oder soll ich alles dem OS überlassen??
 
G

Guest

Gast
Klar, die werden vom Scheduler auf die Prozessoren verteilt (oder wenn es nur einer ist: an einen).

Da die CPU aber nur zeitgleich _einem_ Thread die Leistung geben kann, garantiert der Scheduler hier die Vergabe. ALLE Deine Prozesse auf dem Rechner laufen threadbasiert, denn so funktioniert auch "Multi-Tasking": Schnell zwischen den Threads hin und herschalten.

Wichtig ist, wenn Du in diesem Thema nicht soweit drinsteckst, dass Du auch die Auswirkungen innerhalb Deiner Laufzeit beachtest. Threads lesen und schreiben unter Umständen Werte, die für andere interessant sind - oder werden.

synchronized und volatile solltest Du Dir in jedem Fall mal ansehen, auch was ein Mutex-Objekt ist, und was Dir das Concurrency-Package bietet.


Ansonsten gilt: erstelle soviele Threads, wie Du benötigst ;)
 
G

Gelöschtes Mitglied 5909

Gast
java.util.concurrent.ThreadPoolExecutor

sehr nett ;)

mit

Runtime.getRuntime().getAvailableProcessors() kannst du dann die anzahl der prozessoren auslesen

mit Executors#newFixedThreadPool(int nThreads)

kann man ganz easy nen Pool erstellen
 
G

Gast2

Gast
Moin,

Anonymous hat gesagt.:
Da die CPU aber nur zeitgleich _einem_ Thread die Leistung geben kann

eher Kerne ... es werden soviele Threads wie kerne gleichzeitig abgearbeitet (1 Kern -> 1 Thread, 4 Kerne -> 4 Threads)

Anonymous hat gesagt.:
Ansonsten gilt: erstelle soviele Threads, wie Du benötigst ;)

ACK :D

vadimiron hat gesagt.:
Wie ich verstehe - wird das durch das OS geregelt.... Kann (und sollte) man dies beeinflussen?
ja und nein ... unter Windows (Linux/$BS vermutlich auch) ist es möglich einen Prozess/Thread auf einen Kern festzunageln ... ob das allerdings Sinn macht ist Situations abhängig

Beispiel 1 - Gameserver ... wenn Du nur einen Gameserver zu laufen hast, wird er sich selber nicht die CPU-Leistung weg fressen ... Probleme gibt es bei 2 (oder mehr) Gameserver ... hier macht es wiederum Sinn diese auf die einzelnen Kerne festzunageln ... dann frist Gameserver A bei einem Mapwechsel (oder große Grafische Aktion) nicht die CPU von Gameserver B weg

Beispiel 2 - Bildverarbeitung ... wenn Du Bildverarbeitung programmierst, macht sich ein großer Cache bemerkbar ... da das Bild (was Du gerade verarbeitest) im Cache liegt wird bei einem Kontextwechsel der gesammte Cache in den nächsten Kern geladen - das dauert ... also festnageln ... allerdings kommt hier die Architektur der CPU wieder mit ins Spiel ... wenn L1/L2/L3 für alle Kerne gemeinsam zuständig sind, dann macht ein festnageln wiederum keinen Sinn

für Programme mit Benutzerinteraktion macht das verschieben von Threads keinen Sinn - lass das BS für Dich arbeiten ... das kann es eigentlich ganz gut ... und dieser Fall trifft für 99% der Programmierung zu :wink:

das es Situations abhängig ist erwähnte ich wohl schon


hand, mogel
 

vadimiron

Mitglied
Noch eine Frage...

Meine Klasse, die Thread erweitert, verfügt über ein Objekt, dessen Initialisierung sehr teuer ist und sollte deswegen nur einmal für alle Threads vorgenommen werden. Wenn Threads aber laufen, brauchen sie dieses Objekt nur für sich, da viele Änderungen gemacht werden, die nur lokal für jeden einzelnen Thread von Interesse sind.

Meine erste Idee war: eine statische Variable einführen, die das initialisierte Objekt enthält. dann für jeden Thread wird diese Variable durch Deep Cloning in eine private Variable kopiert - so könnte es laufen.

Frage: wie sollte man sowas machen??? Ist es richtig so, wie ich es vorhabe, oder gibts schönere (richtigere) Lösungen??
 

vadimiron

Mitglied
Noch eine Frage...

Meine Klasse, die Thread erweitert, verfügt über ein Objekt, dessen Initialisierung sehr teuer ist und sollte deswegen nur einmal für alle Threads vorgenommen werden. Wenn Threads aber laufen, brauchen sie dieses Objekt nur für sich, da viele Änderungen gemacht werden, die nur lokal für jeden einzelnen Thread von Interesse sind.

Meine erste Idee war: eine statische Variable einführen, die das initialisierte Objekt enthält. dann für jeden Thread wird diese Variable durch Deep Cloning in eine private Variable kopiert - so könnte es laufen.

Frage: wie sollte man sowas machen??? Ist es richtig so, wie ich es vorhabe, oder gibts schönere (richtigere) Lösungen??
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wie funktionieren parallele Java Streams? Allgemeine Java-Themen 1
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
M Parallele Konzepte in Java Allgemeine Java-Themen 4
M Parallele Programmierung: volatile Variable nimmt ungewöhnlichen Wert an Allgemeine Java-Themen 3
C Open Soure Projekte für parallele Programmierung Allgemeine Java-Themen 6
B parallele / Multithreaded Iteration über Map Allgemeine Java-Themen 12
6 Java - Threads - parallele Programmierung - Tutorial Allgemeine Java-Themen 6
I parallele Programmierung mit Java Allgemeine Java-Themen 3
P Java 3D parallele Ebenen Allgemeine Java-Themen 4
S Programm für parallele bearbeitung Allgemeine Java-Themen 11
A Parallele Threads oder verschachtelte? Allgemeine Java-Themen 7
T parallele Schnittstelle auslesen Allgemeine Java-Themen 5
H javax.comm und Parallele Schnittstelle (PIN für PIN) Allgemeine Java-Themen 7
H Zugriff auf parallele Schnittstelle Allgemeine Java-Themen 4
Zrebna Ausführung einer Testmethode in der IDE erfolgreich - failt aber via 'mvn test' Allgemeine Java-Themen 5
J Fehlermeldung bei Ausführung von .jar-Datei Allgemeine Java-Themen 9
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
M Webservice timeout bei Ausführung der .jar Allgemeine Java-Themen 3
L Fehler bei der Ausführung einer Jar Allgemeine Java-Themen 2
S Fehlermeldungen erscheinen erst in der Ausführung des Programms Allgemeine Java-Themen 11
A einmalige Ausführung eines Methodenabschnittes Allgemeine Java-Themen 3
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
B Ungewollte mehrmalige ausführung des codes Allgemeine Java-Themen 10
H Plattformunabhänginge Ausführung einer .jar Datei Allgemeine Java-Themen 8
R Internetverbindung weg bei ausführung Allgemeine Java-Themen 3
W Deserialisierung und Ausführung Allgemeine Java-Themen 2
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
Daniel_L Mehrfache Ausführung desselben Threads/Tasks verhindern? Allgemeine Java-Themen 4
D Eclipse-build vs. Jar-Ausführung Allgemeine Java-Themen 3
V Ausführung Client- oder Serverseitig? Allgemeine Java-Themen 13
I Thread eine bestimmte Zeit zur Ausführung geben Allgemeine Java-Themen 2
R ClientHTTPRequest - bei mehrfacher Ausführung? Allgemeine Java-Themen 2
K Richtige JVM für jar Ausführung? Allgemeine Java-Themen 4
F JAR-Datei-Ausführung löst Fehler aus Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben