Java-Thread-Dump-Prio-Wert stimmt nicht mit echter Thread-Priorität auf Linux überein?

8

Ich beabsichtige Thread-Prioritäten innerhalb meines Java-Codes zu verwenden. Die Anwendung soll auf meinem Linux-System laufen:

%Vor%

Nach einigem Lesen im Web starte ich nun meine Test-Applikation mit folgendem Befehl:

%Vor%

Die Testanwendung besteht aus den folgenden zwei Klassen:

%Vor%

Wenn ich das Programm für eine Minute zählen lasse (NUM_MILLIS_TO_COUNT_FOR = 1 * 60 * 1000), bekomme ich folgende Ausgabe:

%Vor%

Nach dieser Ausgabe scheinen die Prioritäten die erwartete Wirkung zu haben! Aber wenn ich einen Thread-Dump mit "jstack" oder "kill -s QUIT" erzeuge, dann bekomme ich die folgende Ausgabe, was bedeutet, dass JEDER FADEN DIE GLEICHE PRIORITÄT HAT (prio = 10):

%Vor%

Wenn ich dasselbe auf einer Windows-Maschine mache, sind die prio-Werte die richtigen, entsprechend den Prioritätszuordnungen, die ich gefunden habe hier .

Also, ist das ein Fehler im JStack, oder mache ich etwas falsch?

Wenn ich "top | grep java" ausfühle, bekomme ich Folgendes:

%Vor%

was impliziert, dass der Haupt-Thread eine Priorität von 20 hat, während "top -H | grep java" folgende Ausgabe ergibt:

%Vor%

zeigt, dass die Java-Thread-Prioritäten die Prioritäten der OS-Threads beeinflussen.

Aber wo hat jstack einen Wert von 10 in prio = 10 von? Ist es nur ein willkürlicher Wert?

    
max 03.05.2012, 11:58
quelle

2 Antworten

0

Thread-Priorität in Java ist ein sehr sehr sensibles Thema ... Sie finden einen interessanten Post auf StackOverlow hier: Ссылка

Versuchen Sie im Grunde, Ihre Prioritätsrichtlinie auf 42 zu ändern:

%Vor%

Lass es uns wissen, wenn es den Trick für dich macht!

Sie können alle Erklärungen finden, indem Sie dem Link folgen.

    
tibo 04.06.2012 23:55
quelle
0

Der Java 7-Dokument Status

  

HINWEIS - Dieses Dienstprogramm wird nicht unterstützt und ist möglicherweise in zukünftigen Versionen des JDK nicht verfügbar.

Also würde ich annehmen, dass die Ausgabe von jstack möglicherweise nicht genau ist, da sich die Implementierungsdetails auf Linux geändert haben könnten.

Die von htop -H angegebenen Werte stimmen mit diesem Artikel überein, den Sie in Ihrem Artikel enthalten haben Frage, und sind diejenigen, auf denen die Java-Prozesse innerhalb des Linux-Kernels geplant sind.

Wenn Sie die Ausgabe von jstack den von top -H gemeldeten Threads zuordnen müssen, müssen Sie nur nid von jstack in dezimal oder pid von top -H in hex konvertieren. Siehe diesen Artikel

In Bezug auf Ihren Quellcode: Das Programm würde nicht enden, wenn ich es ausführe. Drei Hinweise beim Schreiben von Produktions-Multitasking-Code:

  • Wenn Sie wissen, dass alles erledigt ist (wie nach dem Aufruf von printCounts() von main ) zögern Sie nicht, System.exit(0); zu verwenden, um sicherzustellen, dass alle Threads beendet sind.
  • Wenn Sie Ihren Code für das Verhalten während der parallelen Ausführung testen möchten, ist es oft gut, zuerst alle Thread s zu erstellen und sie synchron arbeiten zu lassen. Rufen Sie await() für eine freigegebene CountDownLatch oder CyclicBarrier als erste Anweisung des Arbeiters wird dies oft tun Trick gut genug.
  • Während boolean lesen und schreiben atomar sein soll wie in Java-Tutorial Ich würde empfehlen, Trigger-Variablen wie Ihr goOn -Feld für flüchtig zu erklären, da dies auch Einfluss darauf hat, wie der Compiler Ihren Code optimieren wird.

Unter Verwendung von volatile oder System.exit(0) wurde Ihre Benchmark normal beendet.

    
TheConstructor 03.03.2014 23:22
quelle