2013-03-18 15 views
7

Mam żądanie utworzenia analizy uruchomionych wątków w JVM w celu monitorowania długotrwałych zadań. Czy istnieje sposób na znalezienie daty/czasu rozpoczęcia wątku Java? Nie mam problemu z uzyskaniem wątków, ale nie mogę znaleźć sposobu, aby dowiedzieć się, jak długo wątek był aktywny lub kiedy się zaczął. Aby uzyskać wątki, po prostu wyliczam na ThreadGroup.Czy istnieje sposób ustalenia, kiedy wątek Java został uruchomiony?

Należy pamiętać, że nie mam wpływu na same wątki, więc nie mogę wstawić czasu ani właściwości i samodzielnie zarejestrować czasu rozpoczęcia. Wszystko, co mam, to sam wątek i muszę określić dane z tego. Mogę znaleźć dwie metody na wątku - "getThreadCpuTime()" i "getThreadUserTime()", ale nie jestem pewien, czy to wystarczy, ponieważ najwyraźniej wątek będzie czasami wywoływał metodę sleep(), i obawiam się, że czas "uśpienia" nie zostałby uwzględniony w żadnej z tych metod.

Czy istnieje sposób określenia czasu rozpoczęcia wątku? A może jedna z dwóch metod czasu zwróci jak długo wątek był aktywny?

+2

Related: [http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime] (tworzenie Temat i czas życia) – Jayan

+0

Powiązane: [http://stackoverflow.com/questions/12491112/thread-creation-listener] (detektor tworzenia nici) –

+0

Możesz użyć 'ThreadLocal', aby zapisać czas rozpoczęcia dla tego' Thread'. –

Odpowiedz

1

Czy może to być problem X-Y?

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

ja nie znam żadnego sposobu określenia, kiedy rozpoczął wątek. Ale nie jestem pewien, czy to naprawdę istotne informacje. Czy próbujesz profilować wydajność? Czy starasz się używać długotrwałych wątków jako wskaźnika słabej wydajności?

Problem polega na tym, że wątki są ponownie używane przez cały czas. Tomcat łączy swoje wątki AJP i HTTP. Gdy otrzymają nowe żądanie, wątek wyrwie się z pętli i wykona jakąś akcję, a następnie powróci do stanu oczekiwania. Chcesz zmierzyć to działanie, a nie wątek w całości.

Weź kolejny przykład, wątek do zbierania śmieci. To zawsze będzie długotrwały wątek, ponieważ zaczyna się od czasu uruchomienia JVM!

0

Jeśli masz możliwość definiowania własnych Thread podklasy, można zrobić coś takiego:

class WugThread extends Thread 
{ 
    // constructors 

    long timeStarted = -1; 

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

Oczywiście, to niekoniecznie będzie odzwierciedlać DOKŁADNIE, gdy wątek się rozpoczął, ale nie powinien różnić się o więcej niż kilka milisekund od momentu rozpoczęcia wątku i jest zdecydowanie najłatwiejszym sposobem śledzenia tych informacji. – Wug

+2

PO powiedział, że nie może tego zrobić. – Brandon

+0

Zostawię tam odpowiedź dla osób, które znajdą to pytanie w przyszłości. Bez robienia czegoś naprawdę nieprzyjemnego, polegającego na zastąpieniu systemowej implementacji wątku tym, który to wspierał, prawdopodobnie masz kłopoty. getThreadCpuTime zwróci całkowity czas spędzany przez wątek na procesorze, w tym czas jądra, a getThreadUserTime zwróci całkowity czas, jaki wątek spędził w przestrzeni użytkownika na CPU. Masz rację, czas spędzony na spaniu nie pojawi się tutaj. – Wug

1

Choć może nie być w stanie rozszerzyć wątek, można zajrzeć do korzystania Aspect Oriented Programming do przecięcia nowe uruchomienie możliwe do uruchomienia i rejestracja czasu rozpoczęcia w tym momencie.

Spójrz na AspectJ/Wiosna AOP

Powiązane problemy