Java System.currentTimeMillis() 在调试时表现出不同的行为;几乎就像两个狭缝实验

Java System.currentTimeMillis() exhibits different behavior when debugging; almost like two slit experiment

我的代码使用系统时间在绘制图像之前创建延迟。在主循环中重复调用 draw 方法。这是代码

private long delayToStartDraw = 1000;
private long callToStartDrawingInitialTime = 0;

public void draw(SpriteBatch batch) {
    if (button != null && !shouldHide) {
        boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime;
        if(shouldDraw){
            button.draw(batch);
        }
    }
}

奇怪的是,如果我在 "boolean shouldDraw = ..." 上设置一个断点,它会 return 为真并每次绘制我的图像。但是,如果我在 "if(shouldDraw){" 行上放置一个断点,那么它每次都会 return 为 false。

有一个不一致,如果我观察我的布尔值的评估,它总是 return 为真。只有当我不看它在调试器中评估时(这将是正常情况)才会 return false。

我猜调用的结果可能被缓存了或者什么的,java 在评估上走捷径并假定它的初始值(false)因为它认为每次调用都应该相同,但是有人知道发生了什么事吗?

设置断点后,应用程序将在该行代码之前立即停止。

如果断点在第一行,那么 System.currentTimeMillis() 只会在您告诉程序在该行继续执行后才会被调用。如果这是在你的断点被击中后的几秒钟,它更有可能使你的条件为真,因为你实际预期的时间已经过去了。

这很有道理。如果您将断点放在行上:

boolean shouldDraw = System.currentTimeMillis() - delayToStartDraw > callToStartDrawingInitialTime;

调试器在执行该行之前 中断,特别是 发生 System.currentTimeMillis() 调用之前。所以可以说时钟是"still ticking"。当您进入下一行时,1000 毫秒已经过去,布尔值将为 true.

另一方面,如果您在此行中断:

if(shouldDraw){

布尔值已设置(显然为 false),调试器不再影响计时行为。