有没有一种方法能够确定Java线程的启动时间?

7
我收到一个请求,需要分析在JVM中运行的线程以监控长时间运行的作业。有没有办法找到Java线程的启动日期/时间?我可以轻松获取线程,但无法找到任何方法来确定线程活动时间或启动时间。为了获取线程,我只是枚举ThreadGroup。请注意,我无法控制实际线程本身,因此无法放置任何时间或属性并记录自己的开始时间。我只有实际的线程本身,并需要从中确定数据。我可以在线程上找到两种方法——“getThreadCpuTime()”和“getThreadUserTime()”,但我不确定这些是否足够,因为显然线程会偶尔调用sleep()方法,我担心“睡眠”时间不会包含在这两个方法之内。有没有办法确定线程的启动时间?或者这两个时间方法是否返回线程活动时间?

2
相关:[https://dev59.com/nWHVa4cB1Zd3GeqPr_jn](线程创建和生命周期) - Jayan
相关链接:[https://dev59.com/n2jWa4cB1Zd3GeqPsJz6] (线程创建监听器) - Łukasz Rzeszotarski
你可以使用 ThreadLocal 来保存该 Thread 的开始时间。 - Vishal K
相关:https://dev59.com/nWHVa4cB1Zd3GeqPr_jn - Aaron Digulla
3个回答

1
这可能是一个X-Y问题吗?

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

我不知道任何确定线程启动时间的方法。但我不确定这是否真正相关。您是在尝试分析性能吗?您是否试图使用长时间运行的线程作为性能差的指标?
问题在于线程一直被重复使用。Tomcat池化其AJP和HTTP线程。当它们接收到新请求时,线程将退出其循环并执行某些操作,然后返回等待状态。您想要测量该操作,而不是整个线程。
再举一个例子,垃圾收集器线程。它始终是长时间运行的线程,因为它从JVM启动时间开始!

1
虽然您可能无法扩展线程,但可以考虑使用面向切面编程来拦截新的Runnable启动并在此时记录开始时间。
请查看AspectJ / Spring AOP。

0
如果您有能力定义自己的Thread子类,您可以像这样做:
class WugThread extends Thread
{
    // constructors

    long timeStarted = -1;

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

显然,它不一定会准确反映线程启动的时间,但与线程实际开始执行的时间相差不超过几毫秒,是追踪此信息的最简单方法。 - Wug
2
OP说他做不到这个。 - Brandon
1
我会将答案留在那里,供未来发现这个问题的人参考。除非采取某些涉及替换线程系统实现以支持此操作的非常恶劣的措施,否则您可能会遇到一些麻烦。getThreadCpuTime将返回线程在CPU上工作的总时间,包括内核时间,而getThreadUserTime将返回线程在CPU上在用户空间中花费的总时间。您是正确的,在睡眠期间花费的时间不会显示在这里。 - Wug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接