7 Stimmen

Gibt es eine Möglichkeit, festzustellen, wann ein Java-Thread gestartet wurde?

Ich habe eine Anfrage erhalten, eine Analyse der laufenden Threads innerhalb einer JVM zu erstellen, um lange laufende Jobs zu überwachen. Gibt es einen Weg, um das Startdatum/-zeit eines Java-Threads zu finden? Ich habe kein Problem damit, die Threads zu bekommen, aber ich kann einfach nicht herausfinden, wie lange der Thread aktiv war oder wann er gestartet wurde. Um die Threads zu erhalten, durchlaufe ich einfach die ThreadGroup.

Beachten Sie, dass ich keine Kontrolle über die tatsächlichen Threads selbst habe, also kann ich keine Zeit oder Eigenschaft einsetzen und die Startzeit selbst protokollieren. Alles, was ich habe, ist der tatsächliche Thread selbst und ich muss die Daten daraus bestimmen. Ich kann zwei Methoden auf dem Thread finden -- "getThreadCpuTime()" und "getThreadUserTime()", aber ich bin mir nicht sicher, ob diese ausreichen, da der Thread anscheinend gelegentlich die sleep() Methode aufruft und ich befürchte, dass die "Schlafzeit" nicht in einer dieser Methoden enthalten wäre.

Gibt es einen Weg, um die Startzeit für einen Thread zu bestimmen? Oder werden eine der beiden Zeitmethoden zurückgeben, wie lange ein Thread aktiv war?

1voto

Brandon Punkte 9522

Könnte dies ein X-Y-Problem sein?

http://www.perlmonks.org/index.pl?node_id=430320

Ich kenne keinen Weg, um festzustellen, wann ein Thread gestartet wurde. Aber ich bin mir nicht sicher, ob das wirklich relevante Informationen sind. Versuchen Sie die Leistung zu profilieren? Versuchen Sie, lang laufende Threads als Anzeichen für eine schlechte Leistung zu verwenden?

Das Problem dabei ist, dass Threads die ganze Zeit wiederverwendet werden. Tomcat poolt seine AJP- und HTTP-Threads. Wenn sie eine neue Anfrage erhalten, wird ein Thread aus seiner Schleife ausbrechen und eine Aktion ausführen, bevor er in den Wartezustand zurückkehrt. Sie möchten diese Aktion messen, nicht den Thread in seiner Gesamtheit.

Nehmen wir ein weiteres Beispiel, den Garbage Collector Thread. Das wird immer ein langer laufender Thread sein, weil er zur JVM-Startzeit beginnt!

1voto

codeghost Punkte 1014

Obwohl es Ihnen möglicherweise nicht möglich ist, Thread zu erweitern, könnten Sie in Betracht ziehen, Aspektorientierte Programmierung zu verwenden, um das Starten eines neuen Runnable zu unterbrechen und die Startzeit zu protokollieren.

Schauen Sie sich AspectJ / Spring AOP an

0voto

Wug Punkte 12718

Wenn Sie die Möglichkeit haben, Ihre eigene Thread-Unterklasse zu definieren, könnten Sie etwas Ähnliches tun:

class WugThread extends Thread
{
    // Konstruktoren

    long timeStarted = -1;

    public void start()
    {
        super.start();
        timeStarted = System.currentTimeMillis();
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X