假设我有以下程序:
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,以了解它们需要多长时间(使用Guava的秒表或类似的东西)。当串行运行时,我得到了预期的15秒和12秒。然而,当并行运行时,我得到例如15秒和22秒,因为程序B花时间等待程序C上的锁定。
有没有一种方法可以忽略以这种方式阻塞的时间,并获得与串行运行时相同的时间?更有用的是分解,例如"程序B占用了22秒,其中10秒在其他线程上阻塞"
如果要在线程级别监视此情况,可以将getState()
调用为Thread
对象,以查看与RUNNABLE
状态相比,每个Thread
具有BLOCKED
state
的时间。