Windows kennt ja die Anzahl der logischen CPUs. Wird diese Information auch an Java übermittelt? Ich möchte je nach System die optimale Anzahl an Threads starten.
int cpu = (int) (Runtime.getRuntime().availableProcessors());
> Ich möchte je nach System die optimale Anzahl > an Threads starten. Das kann man aber pauschal nicht sagen, das die Anzahl der Thread der anzahl der CPUs das optimum ergibt. Beispiel 1: 4CPUs und jeder Thread soll eine Datei auf der Festplatte kopieren - bei 4Thread bist du am ende Langsamer als wenn du nur 1Thread nimmt. Die Festplatte arbeitet nicht opitmal wenn mehere gleichzeitige zugriffe laufen. (normale Festplatte, kein Raid, keine SSHD, keine Ramdisk) Beispiel 2: 1 CPU und 1Thread der Daten aus einer Datenbank abruft. Das system langweilt sich vermutlich weil die Datenbank inc. Netzwerk nicht hinterherkommt. Da muss man also mehr Thread starten.
Danke für euere Antworten. Speziell in meinem Fall (Bilder berechnen) ist es das Optimum. ;)
Kann man denn davon ausgehen, dass Java die verschiedenen Threads auch tatsächlich auf verschiedene Prozessoren verteilt? Zumal Java-Threads ja keine echten Prozesse sind.
Ein Prozess (z.B. Java VM) kann durchaus aus mehreren parallel laufenden Threads bestehen.
>> Zumal Java-Threads ja keine echten Prozesse sind.
Threads gehören zum Prozess. Andernfalls kann man ja selbst Einfluss
nehmen. Die Lastverteilung funktioniert ganz gut, das haben sie
einigermassen hingekriegt. Du kannst dir ja die Java Sources anschauen
ggf. für deine Zwecke anpassen. Wenns perfekt werden soll...
Frage schrieb: > Danke für euere Antworten. Speziell in meinem Fall (Bilder berechnen) > ist es das Optimum. ;) Also meiner Ansichtnach irrst du da. Die VM KANN das auf zwei Prozessoren verteilen... muß es aber nicht vieleicht nuzt ein anderes Programm kontinuierlich die andere CPU. Solche Optimierungen bringen nix, du solltest einfach soviele Threads starten wie du brauchst. Wenn du Glück hast laufen sie parralel, wenn nicht muß die Arbeit trozdem getan werden dann bringt es auch nichts zu warten bis die erste Operation fertig ist (Ausnahme natürlich wie schon angeprochen I/O auf Geräte die keinen wahlfreien Zugriff erlauben oder dieser sehr 'teuer' ist)
@Läubi .. dem kann ich nicht zustimmen. Es macht überhaupt kein sinn wenn 100 Bilder zu verarbeiten sind, dann 100Threads zu starten weil einfach dann nichts mehr auf dem System geht. Wenn aber 2CPUs vorhanden sind dann macht es schon Sinn 2Thread zu starten. Selbst wenn etwas anderes noch läuft ist es es guter Kompromiss. Man könnte aber auch dem Nutzer die wahl nach der anzahl der Thread lassen aber als Default ist in diesem fall die anzahl der cpus schon ok
@Peter Ja okay, das war etwas allgemein gesagt. Wollte nur sagen das nicht man sich nicht zuviel davon versprechen sollte. Man sollte natürlich immer wissen was man tut, wobei 100 Threads auch noch nicht so die große Herausforderung für die VM darstellt ;)
> Man könnte aber auch dem Nutzer die wahl nach der anzahl der Thread > lassen aber als Default ist in diesem fall die anzahl der cpus schon ok Jo, genau das hatte ich auch vor. :) Jedenfalls rendert mein P4 Einkerner schneller, wenn ich zwei Threads starte, da das Hyperthreading der CPU dann ausgenutzt wird.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.