2009-12-11 23 views
41

Wie unterscheide ich laufende Java-Threads und native Threads?Unterscheiden zwischen Java-Threads und OS-Threads?

In Linux gibt es Parent-Prozess für jeden Child-Prozess, und sie sagen, dass 0 der Elternteil des gesamten Prozesses ist, wird es einen übergeordneten Thread aller gegabelten Java-Threads geben?

Woher weiß ich, welcher Java-Thread zu OS-Thread gehört (wenn ein Java-Thread einen nativen Prozessthread abgibt).

Gibt es eine Namenskonvention von Java-Threads und OS-Threads?

Können laufende Java-Threads von einem anderen Java-Code ausgesetzt oder gelöscht werden?

+0

Stephen C, Ich lerne, wie Linux Thread-Namen und Java-Thread-Namen miteinander verwandt sind. Und wie wird JVM Thread-Management unter Linux verwaltet? – karthi

Antwort

61

Unter Linux werden Java-Threads mit nativen Threads implementiert. Daher unterscheidet sich ein Java-Programm, das Threads verwendet, nicht von einem nativen Programm, das Threads verwendet. Ein "Java-Thread" ist nur ein Thread, der zu einem JVM-Prozess gehört.

Auf einem modernen Linux-System (eines mit NPTL) haben alle Threads, die zu einem Prozess gehören, die gleiche Prozess-ID und Elternprozess-ID, aber unterschiedliche Thread-IDs. Sie können diese IDs anzeigen, indem Sie ps -eLf ausführen. Die PID-Spalte ist die Prozess-ID, die PPID-Spalte ist die Elternprozess-ID und die LWP-Spalte ist die Thread-ID (LightWeight-Prozess). Der "Haupt" -Thread hat eine Thread-ID, die der Prozess-ID entspricht, und zusätzliche Threads haben unterschiedliche Thread-ID-Werte.

Ältere Linux-Systeme können anstelle von NPTL die "linuxthreads" -Threading-Implementierung verwenden, die nicht vollständig POSIX-kompatibel ist. Auf einem linuxthreads-System haben Threads unterschiedliche Prozess-IDs.

Sie können überprüfen, ob Ihr System NPTL oder lintuxthreads verwendet, indem Sie die C-Bibliothek (libc) des Systems als eigenständiges Programm ausführen und in der Ausgabe unter "Verfügbare Erweiterungen" suchen. Es sollte entweder "Native POSIX-Thread-Bibliothek" oder linutxthreads erwähnt werden. Der Pfad zur C-Bibliothek variiert von System zu System: Er kann /lib/libc.so.6, /lib64/libc.so.6 (auf 64-Bit-RedHat-basierten Systemen) oder etwas wie /lib/x86_64-linux-gnu/libc.so.6 (auf modernen Debian-basierten Systemen wie Ubuntu) sein.

Auf Betriebssystemebene haben theads keine Namen; Diese existieren nur innerhalb der JVM. Die C-Funktion kann verwendet werden, um ein Signal an einen bestimmten Thread zu senden, mit dem Sie versuchen könnten, diesen spezifischen Thread von außerhalb der JVM zu entfernen, aber ich weiß nicht, wie die JVM darauf reagieren würde. Es könnte nur die ganze JVM töten.

+0

Danke Wyard, kann ich laufende Thread und Abfragedetails von running Thread nennen? Ich frage aus Debugging-Perspektive. – karthi

+0

Der Name eines Threads ist Java-spezifisch. Um diese Art von Informationen zu sehen, müssten Sie sich mit einem Debugger mit der JVM verbinden. Außerhalb der JVM können Sie nur die numerische ID sehen, die aus POSIX-Sicht die einzige ID ist. – Wyzard

+0

Was sollte man tun, um den Java-Thread-Namen in der Shell-Eingabeaufforderung anzuzeigen? Wenn ich meinen Profiler oder Debugger an eine laufende JVM anschließe, kann ich dann die laufenden Java-Thread-Namen abrufen und das Shell-Skript bereitstellen? – karthi

8

Es gibt keinen Standard; Dies hängt vollständig von der Java-Implementierung ab, die Sie verwenden. Verwechseln Sie auch nicht "native Threads" und "native Prozesse". Ein Prozess ist eine isolierte Entität, die den Adressraum anderer Prozesse nicht sehen kann. Ein Thread ist etwas, das im Adressraum eines nativen Prozesses abläuft und in den Speicher anderer Threads desselben Prozesses hineinschauen kann.

Was Sie auf Linux sehen, ist etwas anderes: Einige Versionen von Linux erstellen einen Eintrag in der Prozesstabelle für jeden Thread eines übergeordneten Prozesses. Diese "Prozesse" sind keine realen Prozesse (im Sinne der Isolation). Sie sind Threads, die mit dem Befehl ps aufgelistet werden können. Sie können den Prozess, der sie erstellt hat, mithilfe der übergeordneten PID (PPID) finden.

4

Es gibt keine generische Lösung, wie Java-Threads OS-Threads zugeordnet werden, wenn überhaupt. Jede JVM-Implementierung kann dies auf andere Weise tun.

Es gibt auch eine reine Java-Thread-Implementierung namens green threads. Dies wird als Fallback verwendet, wenn systemeigene Threads nicht unterstützt werden oder das System überhaupt nicht multithreadfähig ist. In Ihrem Betriebssystem werden keine grünen Threads angezeigt.

Können laufende Java-Threads von einem anderen Java-Code ausgesetzt oder gelöscht werden?

Wenn sie auf der gleichen JVM laufen, ja, mit stop(). Aber das ist keine gute Lösung und kann funktionieren oder nicht. interrupt() lässt den Thread so sicher herunterfahren.

Es gibt keine Möglichkeit, Threads außerhalb der JVM zu beenden, die ich kenne. Wenn ein Betriebssystem das Töten von Threads wirklich unterstützt, würde ich nicht erwarten, dass die Java-Anwendung danach korrekt ausgeführt wird!

5

kann ein Ausführen von Java-Threads können ausgesetzt oder von einem anderen Java Code getötet werden?

In der Theorie ja. In der Praxis sind die Methoden Thread.kill() und Thread.suspend() veraltet, da sie außer in sehr begrenzten Situationen nicht sicher sind. Das grundlegende Problem besteht darin, dass das Töten oder Unterbrechen eines Java-Threads andere Threads, die davon abhängen, und freigegebene Datenstrukturen, die sich möglicherweise gerade in der Mitte des Updates befanden, wahrscheinlich durcheinander bringt.

Wenn "ein anderer Java-Code" eine andere JVM bedeuten soll, sind die Chancen, dass es funktioniert, noch geringer. Selbst wenn Sie herausgefunden haben, wie Sie das relevante Thread-Signal senden, sind die Ergebnisse völlig unvorhersehbar. Meine Wette ist, dass die "Ziel" JVM abstürzen würde.

+0

Sie könnten einfach den Linux-Befehl aus Ihrem Java-Code ausführen, um einen bestimmten Thread zu beenden, der unter einer bestimmten JVM läuft. Sie können dies sogar unter Windows tun. Aber ich nehme an, dass Sie wahrscheinlich Recht haben, dass die Eltern-JVM dieses Threads einfach abstürzen wird. Wenn Sie beide Programme steuern, sollten Sie wahrscheinlich eine Art von IPC-Aufrufen entwickeln, um den Threads in einem anderen Prozess mitzuteilen, dass sie nicht mehr anhalten sollen. – PSIXO

Verwandte Themen