【问题标题】:Is there a way to determine when a Java thread started?有没有办法确定 Java 线程何时启动?
【发布时间】:2013-03-18 14:27:48
【问题描述】:

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

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

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

【问题讨论】:

标签: java multithreading


【解决方案1】:

这可能是 X-Y 问题吗?

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

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

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

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

【讨论】:

    【解决方案2】:

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

    看看 AspectJ / Spring AOP

    【讨论】:

      【解决方案3】:

      如果你有能力定义自己的Thread 子类,你可以这样做:

      class WugThread extends Thread
      {
          // constructors
      
          long timeStarted = -1;
      
          public void start()
          {
              super.start();
              timeStarted = System.currentTimeMillis();
          }
      }
      

      【讨论】:

      • 显然,它不一定能准确反映线程何时启动,但与线程实际开始执行时的差异不应超过几毫秒,并且是迄今为止最简单的方法跟踪此信息。
      • OP 说他不能这样做。
      • 我把答案留在那里,供以后发现问题的人参考。如果没有做一些真正令人讨厌的事情,包括用支持它的线程替换系统实现,你可能会遇到一些麻烦。 getThreadCpuTime 将返回线程在 CPU 上工作的总时间,包括内核时间,getThreadUserTime 将返回线程在用户空间在 CPU 上花费的总时间。没错,这里不会显示睡眠时间。
      猜你喜欢
      • 2020-06-05
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2022-01-14
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多