Java-Multithreading - Thread-Priorität

8

Kann jemand erklären, wie die Threadpriorität in Java funktioniert? Die Verwirrung hier ist, wenn Java nicht die Implementierung von Thread gemäß seiner Priorität garantiert, warum wird dann diese setpriority() Funktion verwendet.

Mein Code ist wie folgt:

%Vor%

In dem obigen Programm finde ich keinen Unterschied in der Ausgabe, auch wenn ich die Priorität ändere. Auch eine Echtzeit-Anwendung, wie Thread-Priorität verwendet werden kann, wäre eine große Hilfe. Danke.

    
Neal 02.12.2013, 16:34
quelle

5 Antworten

8

Die Thread-Priorität ist nur ein Hinweis auf den OS-Taskplaner und hängt vom zugrunde liegenden Betriebssystem ab. Das Betriebssystem versucht, einem Thread mit hoher Priorität mehr Ressourcen zuzuweisen, garantiert dies jedoch nicht. Wenn also Ihr Programm von Thread-Prioritäten abhängig ist, dann binden Sie Ihr Programm wiederum an das zugrunde liegende Betriebssystem, was schlecht ist.

Aus Java Concurrency in der Praxis :

  

Vermeiden Sie die Versuchung, Thread-Prioritäten zu verwenden, da sie zunehmen   Plattformabhängigkeit und kann zu Lebhaftigkeitsproblemen führen. Am meisten gleichzeitig   Anwendungen können die Standardpriorität für alle Threads verwenden.

    
Trying 02.12.2013 16:38
quelle
3

Die Threadpriorität ist nur ein Hinweis auf den OS Taskplaner. Der Taskplaner versucht nur, einem Thread mit höherer Priorität mehr Ressourcen zuzuweisen, jedoch gibt es keine expliziten Garantien.

Tatsächlich ist es nicht nur relevant für Java oder JVM. Die meisten Nicht-Echtzeit-Betriebssysteme verwenden Thread-Prioritäten (verwaltet oder nicht verwaltet) nur auf suggestive Weise.

Auch sehr wichtig, Priorties unterscheiden sich von jeder zugrunde liegenden Plattform. Daher verlierst du deine Plattform Freiheit von Java. Siehe auch diese Zusammenfassung:

Tatsächlich können einige Prioritätsstufen der gleichen "nativen" Prioritätsstufe zugeordnet werden. Hier ist die Liste (basierend auf dem Hotspot-Code in OpenJDK 6):

Solaris
1 ⇒ 0
2 ⇒ 32
3 ⇒ 64
4 ⇒ 96
5 - 10 ⇒ 127
Beachten Sie, dass Sie unter "Solaris" die Thread-Priorität nicht über den normalen Wert hinaus erhöhen können, sondern senken Sie sie nur: Der Prioritätswert für 5 ist derselbe wie jeder der höheren Werte.

Linux
1 - 10 ⇒ 4 - -5 (nette Werte) Beachten Sie, dass unter Linux verschiedene Threadprioritäten in Java unterschiedlichen Prioritätswerten auf nativer Ebene zugeordnet werden.

Windows
1 - 2 ⇒ THREAD_PRIORITY_LOWEST
3 - 4 ⇒ THREAD_PRIORITY_BELOW_NORMAL
5 - 6 ⇒ THREAD_PRIORITY_NORMAL
7 - 8 ⇒ THREAD_PRIORITY_ABOVE_NORMAL
9 - 10 ⇒ THREAD_PRIORITY_HIGHEST

Ich habe viele Java-Anwendungen mit mehreren Threads entwickelt, und meiner Meinung nach, wenn Sie die Prioritäten setzen müssen, haben Sie ein anderes Problem. Wie ein schlechter Algorithmus, der zu viel CPU-Zeit verbraucht usw. Ich schlage immer vor, das Java-Thread-Prio nicht zu ändern, da man sich sowieso nicht darauf verlassen kann. (Natürlich gibt es einige Szenarien, in denen es Sinn macht)

    
Colin 02.12.2013 16:37
quelle
1

Es gibt verschiedene Situationen, in denen das Festlegen einer Priorität für einen Thread nützlich ist. Sie sollten also nicht an Garantien glauben, die sich aus solchen Einstellungen ergeben: Die Reihenfolge der Ausführung mit Threads ist nicht definiert . Wenn du denkst, dass dein Thread früher erledigt wird, wenn du ihm eine höhere Priorität gibst, lies bitte die obige Aussage noch einmal, bis dir das aus dem Kopf geht. ;)

Sie sollten die Priorität basierend darauf definieren, wie wichtig es für diesen Thread ist, Ausführungszeit im Vergleich zu den anderen zu erhalten. Auch wenn das zugrunde liegende System nichts garantiert, kann es dennoch für die JVMs, die es unterstützen, von Vorteil sein.

Beispiel: Sie haben ein Programm, das auf der Basis von Benutzereingaben in Ihrem JFrame Berechnungen durchführt. Es ist eine gute Übung, diese Hintergrundthreads auf eine niedrige Priorität zu setzen, da es wichtiger ist, dass der JFrame reagiert als an der Berechnung zu arbeiten (was lange dauern wird, um zu beenden, ein paar mehr Millis werden nicht weh tun) . Das OS weist den Threads mit niedriger Priorität immer noch die meiste CPU-Zeit zu, es sei denn, etwas wichtiger benötigt es. Aber dann ist es gut, dass dieses wichtigere Zeug die Priorität bekommt.

Nun könnte es passieren, dass auf einigen Systemen die Prioritätseinstellung ignoriert wird und der JFrame wieder nicht reagiert, aber das macht dann nichts Schlimmeres an Ihrem Code, als dass Sie die Priorität überhaupt nicht auf niedrig setzen.

    
TwoThe 02.12.2013 17:21
quelle
0

Die Größe der Aufgaben ist zu klein und wird wahrscheinlich gleich nach dem Start abgeschlossen sein. Wenn Sie über genügend CPU-Kerne verfügen, wird jeder Worker-Thread einem einzelnen Kern zugeordnet, sodass das Ergebnis gleich ist.

Versuchen Sie das Experiment in einem anderen Kontext, erhöhen Sie zuerst die Aufgabengröße (z. B. indem Sie eintausend Mal ohne Ausgabe auf eine Million looping), dann erhöhen Sie die Anzahl der Threads, um die Anzahl der Kerne zu überschreiten, und drittens erstellen Sie Ihr Threads zuerst und starten Sie dann alle Threads (Sie können sie nicht sofort starten, Sie müssen sie immer noch durchlaufen).

In meinem Fall habe ich 10 Threads gewählt, weil ich den Code auf einem Prozessor mit zwei hyper-threaded-Cores ausgeführt habe, auf denen vier simultane Threads laufen.

Meine Änderungen an Ihrem Beispiel:

%Vor%

Ergebnisse sind:

%Vor%

Wie Sie sehen, enden die Threads mit der niedrigen Anzahl tendenziell später, weil die Threads mit der höheren Anzahl eine höhere Priorität haben. Indem Sie die Waage auf den Kopf stellen:

%Vor%

Die niedrige Anzahl an Threads wird schneller ausgeführt als die hohen Threads. Einige Threads sind bereits abgeschlossen, bevor andere Threads gestartet werden, da sie im Vergleich zum aufrufenden Programm eine höhere Priorität haben:

%Vor%     
Razvan Popovici 11.05.2016 13:12
quelle
-1
%Vor%     
navin 04.04.2016 14:54
quelle