2013-03-18 4 views
7

У меня есть запрос на создание анализа выполнения потоков в JVM для отслеживания длительных рабочих заданий. Есть ли способ найти начальную дату/время потока Java? У меня нет проблем с получением потоков, но я не могу понять, как долго поток был активным или когда он начинался. Чтобы получить потоки, я просто перечисляю ThreadGroup.Есть ли способ определить, когда начинается поток Java?

Обратите внимание, что я сам не контролирую фактические потоки, поэтому я не могу использовать какое-либо время или свойство и самостоятельно регистрировать время начала. Все, что у меня есть, это собственно поток и нужно определить данные из этого. Я могу найти два метода в потоке - «getThreadCpuTime()» и «getThreadUserTime()», но я не уверен, что их достаточно, так как, по-видимому, поток иногда вызывает метод sleep(), и я боюсь, что «сон» не будет включен ни в один из этих методов.

Есть ли способ определить время начала потока? Или один из двух методов времени вернет, как долго поток был активен?

+2

Связанный: [http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime] (создание темы и время жизни) – Jayan

+0

Связано: [http://stackoverflow.com/questions/12491112/thread-creation-listener] (прослушиватель создания темы) –

+0

Вы можете использовать 'ThreadLocal', чтобы сохранить время начала для этого' Thread'. –

ответ

1

Это может быть проблема X-Y?

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

Я не знаю ни одного способа, чтобы определить, когда поток начал. Но я не уверен, что это действительно релевантная информация. Вы пытаетесь профилировать производительность? Вы хотите использовать длинные потоки в качестве индикатора низкой производительности?

Проблема в том, что потоки постоянно используются повторно. Tomcat объединяет свои потоки AJP и HTTP. Когда они получат новый запрос, поток вырвется из своего цикла и выполнит какое-либо действие, а затем вернется в состояние ожидания. Вы хотите измерить это действие, а не поток в целом.

Возьмем другой пример, резьбу коллектора мусора. Это всегда будет длинный поток, потому что он начинается с момента запуска JVM!

0

Если у вас есть возможность определить свой собственный Thread подкласс, вы могли бы сделать что-то вроде этого:

class WugThread extends Thread 
{ 
    // constructors 

    long timeStarted = -1; 

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

Очевидно, что это не обязательно будет отражать ТОЧНО, когда поток начался, но он не должен отличаться более чем на несколько миллисекунд, когда поток фактически начинает выполняться, и на сегодняшний день является самым простым способом отслеживать эту информацию. – Wug

+2

ОП сказал, что он не может этого сделать. – Brandon

+0

Я оставлю ответ там для ссылки людей, которые найдут этот вопрос в будущем. Если не сделать что-то действительно неприятное, связанное с заменой системной реализации потока тем, кто поддерживал это, у вас, вероятно, есть некоторые проблемы. getThreadCpuTime вернет общее время, затрачиваемое потоком на процессор, включая время ядра, и getThreadUserTime вернет общее время, затрачиваемое потоком в userland на CPU. Вы правы, время, проведенное спящим, не появится здесь. – Wug

1

Хотя вы не можете быть в состоянии расширить тему, вы можете посмотреть в использовании Aspect Oriented Programming перехватывать новый запуск Runnable и запись времени начала в этот момент.

Посмотрите на AspectJ/Spring AOP

Смежные вопросы