我无缘无故地使用计时器卡在for循环中

时间:2016-03-30 03:08:03

标签: java multithreading

我有一个运行的线程,不断更新我的laskAck变量。我将我的超时设置为非常大,以便我的线程有机会更新laskAck变量。当我调试我的代码并逐步运行时,它可以工作,但如果我正常运行,程序会暂停if(timePassed> timeOut)。知道为什么会这样吗???

long timeout = 40000000;
while (lastAck != sent) {
            currentTime = System.currentTimeMillis();
            packetSentTime = send_timer[(sent - 1) % cwnd];
            timePassed = currentTime - packetSentTime;
            if (timePassed > timeOut) {
                ssthresh = (int) (Math.ceil(cwnd / 2));
                cwnd = 1;
                sent = lastAck;
                System.out.println("Time out occured\n" + lastAck);
                timeout = true;
                break;
            }
        }

2 个答案:

答案 0 :(得分:1)

由于存在由另一个线程更新的变量,因此必须以支持线程安全的方式声明该变量。一种方法是使用volatile关键字。其他方法可能包括使用java.util.concurrent包中的类型。

在此处的特定情况下,请确保将变量lastAck声明为:

volatile long lastAck;

并且循环检查将始终从内存中提取值而不是缓存它。

答案 1 :(得分:0)

Java区分大小写,因此timeouttimeOut不同。您需要将条件更改为timePassed > timeout