2013-03-18 8 views
7

Ich habe eine Anfrage, um eine Analyse laufender Threads innerhalb einer JVM zu erstellen, um lange laufende Jobs zu überwachen. Gibt es eine Möglichkeit, den Starttermin eines Java-Threads zu finden? Ich habe kein Problem, die Threads zu bekommen, aber ich kann nicht herausfinden, wie lange der Thread aktiv war oder wann er gestartet wurde. Um die Threads zu erhalten, liste ich einfach über die ThreadGroup auf.Gibt es eine Möglichkeit festzustellen, wann ein Java-Thread gestartet wurde?

Beachten Sie, dass ich keine Kontrolle über die tatsächlichen Threads selbst habe, also kann ich keine Zeit oder Eigenschaft eingeben und die Startzeit selbst protokollieren. Alles was ich habe ist der eigentliche Thread selbst und muss die Daten daraus ermitteln. Ich kann zwei Methoden auf dem Thread finden - "getThreadCpuTime()" und "getThreadUserTime()", aber ich bin mir nicht sicher, ob das genug ist, da der Thread gelegentlich eine sleep() -Methode aufruft, und ich habe Angst davor die "Schlaf" -Zeit wäre in keiner dieser Methoden enthalten.

Gibt es eine Möglichkeit, die Startzeit für einen Thread zu bestimmen? Oder gibt eine der beiden Zeitmethoden zurück, wie lange ein Thread aktiv war?

+2

Verwandte: [http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime] (Thread-Erstellung und Lebensdauer) – Jayan

+0

Related: [http://stackoverflow.com/questions/12491112/thread-creation-listener] (Thread-Erstellung Listener) –

+0

Sie können 'ThreadLocal' verwenden, um die Startzeit für dieses' Thread' zu speichern. –

Antwort

1

Könnte das ein X-Y Problem sein?

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

Ich weiß nicht von irgendeiner Weise zu bestimmen, wann ein Thread gestartet. Aber ich bin mir nicht sicher, ob das wirklich relevante Informationen sind. Versuchen Sie, die Leistung zu profilieren? Möchten Sie lang laufende Threads als Indikator für schlechte Leistung verwenden?

Das Problem dabei ist, dass Threads die ganze Zeit wiederverwendet werden. Tomcat fasst seine AJP- und HTTP-Threads zusammen. Wenn sie eine neue Anforderung erhalten, wird ein Thread aus seiner Schleife ausbrechen und einige Aktionen ausführen, um dann in einen Wartezustand zurückzukehren. Sie möchten diese Aktion messen, nicht den Thread in seiner Gesamtheit.

Nehmen Sie ein anderes Beispiel, den Garbage-Collector-Thread. Das wird immer ein langwieriger Thread sein, weil es zur JVM-Startzeit beginnt!

0

Wenn Sie die Möglichkeit, Ihre eigene Thread Unterklasse zu definieren, können Sie etwas tun könnte:

class WugThread extends Thread 
{ 
    // constructors 

    long timeStarted = -1; 

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

Offensichtlich wird es nicht unbedingt genau angeben, wenn der Thread gestartet wurde, aber es sollte nicht mehr als a abweichen wenige Millisekunden von der tatsächlichen Ausführung des Threads entfernt und ist bei weitem der einfachste Weg, diese Informationen zu verfolgen. – Wug

+2

Das OP sagte, er könne das nicht tun. – Brandon

+0

Ich lasse die Antwort dort für die Referenz von Leuten, die die Frage in der Zukunft finden. Abgesehen davon, dass Sie etwas wirklich Schreckliches tun, indem Sie die Systemimplementierung von Thread durch eine ersetzen, die dies unterstützt, sind Sie wahrscheinlich in Schwierigkeiten. getThreadCpuTime gibt die Gesamtzeit zurück, die der Thread für die Arbeit an einer CPU benötigt, einschließlich der Kernelzeit, und getThreadUserTime gibt die Gesamtzeit zurück, die der Thread im Benutzerland auf der CPU verbracht hat. Du hast Recht, die Zeit, die du schlafst, wird hier nicht auftauchen. – Wug

1

Während Sie nicht in der Lage sein kann, Thema zu erweitern, können Sie Aspect Oriented Programming abfangen Blick in Verwendung ein neues Runnable starten und protokollieren die Startzeit an diesem Punkt.

Werfen Sie einen Blick auf AspectJ/Frühjahr AOP

Verwandte Themen