Java 如何计算程序的时间忽略等待其他线程的时间

Java 如何计算程序的时间忽略等待其他线程的时间,java,multithreading,timing,Java,Multithreading,Timing,假设我有以下程序: public class ProgramA { public void doSomething(ProgramC c) { c.doSomething(); // Do something else that takes 5 seconds. } } public class ProgramB { public void doSomething(ProgramC c) { c.doSomething(); // Do someth

假设我有以下程序:

public class ProgramA {
  public void doSomething(ProgramC c) {
    c.doSomething();
    // Do something else that takes 5 seconds.
  }
}

public class ProgramB {
  public void doSomething(ProgramC c) {
    c.doSomething();
    // Do something else that takes 2 seconds.
  }
}

public class ProgramC {
  public synchronized void doSomething() {
    // Do something that takes 10 seconds
  }
}
我想对程序A和程序B进行计时,以了解使用番石榴秒表或类似产品需要多长时间。当以串行方式运行时,我得到了预期的15秒和12秒。 然而,当并行运行时,我得到例如15s和22s,因为程序B花费时间等待程序C上的锁


有没有一种方法可以忽略以这种方式阻塞的时间,并获得与串行运行时相同的计时?更有用的是细分,例如程序B占用22秒,其中10秒在其他线程上阻塞

如果要在线程级别上监视此情况,可以调用thread对象,查看每个线程的阻塞状态与可运行状态相比有多长时间。

如果要在线程级别上监视此情况,您可以调用Thread对象,查看每个线程有多长时间处于阻塞状态,与可运行状态相比。

因此,您想要的是获取线程所处的各种状态的统计信息,比如线程被阻塞或未运行的频率。我真正想要的是了解程序何时因与线程无关的原因而变得更慢,例如,如果程序A开始使用25秒而不是15秒,我想知道额外的10秒来自线程争用,而不是程序中其他地方的性能退化。您可以分析应用程序,也可以使用visualvm查看线程状态。因此,您想要的是获得线程所处各种状态的统计信息比如线程被阻塞或不运行的频率?我真正想知道的是,程序何时会因为与线程无关的原因而变慢,例如,如果程序A开始使用25秒而不是15秒,我想知道额外的10秒来自线程争用,而不是程序中其他地方的性能退化。您可以分析应用程序,也可以使用visualvm查看线程状态。