So ändern Sie die Priorität eines Laufenden java-Prozess?
In einem stellt sich die Frage, erkundeten wir mit ProcessBuilder starten externer Prozesse mit niedriger Priorität unter Verwendung der OS-abhängigen Befehle. Ich entdeckte auch, dass wenn ein übergeordneter Prozess wird mit niedriger Priorität, dann alle seine Ableger Prozesse beginnen im niedrigen Priorität. So meine neue Frage ist die nach dem starten einer java-Datei (ausführen per Doppelklick auf die ausführbare jar-Datei in windows) in niedriger Priorität oder änderung seiner Priorität programmgesteuert während des Laufs. Ich habe versucht, die änderung der thread-Priorität, dies hat jedoch keine Auswirkung auf die windows Prozess Priorität.
Ich habe Folgendes versucht, aber es ändert nichts an der Priorität des Prozesses im task-manager
public class hello{
public hello(){
try{
Thread.currentThread().setPriority(1);
Thread.sleep(10000);
}catch(Exception e){e.printStackTrace();}
}
}
Die einzige andere Sache, die ich denken kann, ist, starten Sie das Programm mit einer batch-Datei, aber ich würde lieber halten Sie diese in der Familie so zu sprechen. Also, kennt jemand eine java-basierte Methode zum ändern der aktuellen Prozess-Priorität? Im Idealfall wäre es schön zu können, ändern Sie die Priorität des Prozesses in Reaktion auf Benutzereingaben, während das Programm ausgeführt wird.
- auf Un*x kann noch ein externer Prozess, um re-Nizza oder set CPU affinity etc. gesehen, dass dies geschehen kann von der Befehlszeile aus. Keine Ahnung, wie die Dinge funktionieren auf der Windows-Seite der Java-Teich, der sagte 🙂
- in windows müssen Sie SetPriorityClass msdn.microsoft.com/en-us/library/ms686219%28v=vs.85%29.aspx können Sie aufrufen, von JNI/JNA oder einige cmd-line-Tool wie gilchrist.ca/jeff/SetPriority/index.html
- danke, interessant. Macht es Sinn, in einer Weise: ich nehme es, dass die meisten API-Aufrufe werden kann "verpackt" in einem command-line utility, wenn/falls es nicht standardmäßig vorhanden ist. 🙂
- keine Ahnung über die meisten, könnten einige benötigen, um ausgeführt zu werden, indem Sie den gleichen Prozess. Habe ich nicht getan WinAPI Zeug für ein Jahrzehnt (wie ich finde).
Du musst angemeldet sein, um einen Kommentar abzugeben.
https://stackoverflow.com/questions/257859 beschreibt, wie zum ändern der Priorität eines Threads in Windows. Ich weiß nicht, Java-API, um dies zu tun, so dass Sie gehen zu müssen, fallen zurück auf JNI aufrufen der Windows-API. In die Schuhe ich denke, ich würde anfangen mit JNA die lassen ordnen Sie die Funktionen einfach, oder finden Sie eine fertig geschriebene Java-wrapper auf die API, wenn es einen gibt.
Vielleicht sind Sie versucht, etwas zu tun, das OS für Sie tut.
In Unix, unter Last, wobei jeder Prozess eine kurze Zeitscheibe, um seine Arbeit zu tun. Wenn es verwendet alle seine Zeitscheibe es ist davon ausgehen, der Prozess ist CPU-gebunden Priorität senkt. Wenn es Blöcke auf IO, es wird davon ausgegangen, dass E /a-gebunden und dessen Priorität erhöht (weil es nicht alle seine Zeitscheibe)
All dies ist nur von Bedeutung, wenn es nicht genug CPU. Wenn Sie halten Sie die CPU-Auslastung unter 100% die meisten der Zeit, jeden Prozess so viel CPU-Leistung wie es braucht, und die Priorität macht nicht viel Unterschied.
(Der Titel ist nicht windows-spezifisch, aber die tags tun. Aber ich denke, dass es relevant sein könnte, zu wissen, die Unterschiede.)
Im Allgemeinen scheduling der threads einer der Prozesse ist ein kernel-abhängige Funktion, gibt es kaum einen portablen Weg, dies zu tun. In der Tat, was bedeutet Priorität variiert greatkly. Zum Beispiel auf NT einen hohen Wert von 24 bedeutet Echtzeit und ein Wert von 1 bedeutet, dass im Leerlauf. Auf unix ist dies das Gegenteil: 1 ist am schnellsten, und größere Werte sind langsamer.
Natürlich Java abstrahiert diese Informationen entfernt mit
.setPriority
mit einer Reichweite von 1 (niedrigsten) bis 10 (höchste).Etwas nicht wies noch darauf hin, aber ein ziemlich großes problem auf vielen UNIX-Varianten: standardmäßig kann ein Benutzer nicht erhöhen der Priorität eines Prozesses (d.h. reduzieren Sie den nice-Wert), auch wenn der Anwender selbst abgenommen das Prioritätsrecht vor.
Im Gegensatz dazu auf NT-ich denke, man kann reraise Ihre Priorität wieder auf die default-Priorität.
Einfach ausgedrückt:
.setPriority
kann auf windows, aber wird wahrscheinlich nicht funktionieren auf unix.