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?
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.
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:
printCounts()
von main
) zögern Sie nicht, System.exit(0);
zu verwenden, um sicherzustellen, dass alle Threads beendet sind. 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. 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.
Tags und Links java multithreading linux pthreads jstack