【发布时间】:2012-03-26 15:05:31
【问题描述】:
是否有任何工具可用于跟踪 Java 线程的创建和生命周期?我会对以下所有内容感兴趣:
- 调用new Thread()的调用栈
- 调用start()的调用栈
- run() 方法的生命周期
【问题讨论】:
-
在您的特定环境中子类化是一个选项吗?
标签: java multithreading
是否有任何工具可用于跟踪 Java 线程的创建和生命周期?我会对以下所有内容感兴趣:
【问题讨论】:
标签: java multithreading
【讨论】:
我不知道有这样的框架。您当然可以继承 Thread 类并自行存储此信息,如下所示。但是,这不会跟踪在其他类中分配的Threads,例如Executors 等。
public class MyThread extends Thread {
StackTraceElement[] constructorTrace;
StackTraceElement[] startTrace;
long runStartTimeMillis;
long runFinishTimeMillis;
// you'll need to duplicate the constructors you need
public MyThread() {
super();
constructorTrace = Thread.currentThread().getStacktrace();
}
@Override
public void start() {
super.start();
startTrace = Thread.currentThread().getStacktrace();
}
@Override
public void run() {
runStartTimeMillis = System.currentTimeMillis();
super.run();
runFinishTimeMillis = System.currentTimeMillis();
}
}
【讨论】:
Thread.currentThread().getStacktrace() 和System.nanoTime() 进行计时。您也可以只存储 new Throwable 并仅在需要时获取 StackTrace。
Thread.getStacktrace()。我忘记了。堆栈跟踪填充在 Throwable 构造函数中,所以我认为这不会节省任何东西。
getStackTraceElement 我猜是把原生结构翻译成 Java StackTraceElement。说得通。谢谢。
VisualVM now(*) 有一个线程标签
(*) 不知道从什么时候开始
【讨论】: