7

我有一个请求,要创建对 JVM 中正在运行的线程的分析,以监视长时间运行的作业。有没有办法找到 Java 线程的开始日期/时间?获取线程没有问题,但我无法找出任何方法来找出线程已激活多长时间或何时开始。为了获取线程,我只是枚举了 ThreadGroup。

请注意,我无法控制实际线程本身,因此我无法输入任何时间或属性并自己记录开始时间。我只有实际线程本身,需要从中确定数据。我可以在线程上找到两种方法——“getThreadCpuTime()”和“getThreadUserTime()”,但我不确定这些是否足够,因为显然线程偶尔会调用 sleep() 方法,我担心“睡眠”时间不会包含在这两种方法中。

有没有办法确定线程的开始时间?或者这两种时间方法中的任何一种都会返回线程活动的时间?

4

3 回答 3

1

虽然您可能无法扩展 Thread,但您可以考虑使用面向方面的编程来拦截新的 Runnable 启动并记录该点的开始时间。

看看 AspectJ / Spring AOP

于 2013-03-18T14:49:38.593 回答
1

这可能是XY问题吗?

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

我不知道有什么方法可以确定线程何时开始。但我不确定这是否真的相关信息。您是否正在尝试分析性能?您是否正在寻求使用长时间运行的线程作为性能不佳的指标?

问题在于线程一直被重用。Tomcat 汇集了它的 AJP 和 HTTP 线程。当他们收到一个新的请求时,一个线程将跳出它的循环并执行一些操作,然后返回到等待状态。你想衡量那个动作,而不是整个线程。

再举一个例子,垃圾收集器线程。这将始终是一个长时间运行的线程,因为它在 JVM 启动时开始!

于 2013-03-18T14:38:56.540 回答
0

如果您有能力定义自己的Thread子类,则可以执行以下操作:

class WugThread extends Thread
{
    // constructors

    long timeStarted = -1;

    public void start()
    {
        super.start();
        timeStarted = System.currentTimeMillis();
    }
}
于 2013-03-18T14:40:43.093 回答