【问题标题】:I am getting stuck in a for loop for no reason using timer我无缘无故地使用计时器陷入了for循环
【发布时间】:2016-03-30 03:08:03
【问题描述】:

我有一个正在运行的线程不断更新我的 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;
            }
        }

【问题讨论】:

  • 你调查过volatile这个关键字吗?你可以看看this question
  • 谢谢你!!!坚持了一个小时!

标签: java multithreading


【解决方案1】:

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

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

volatile long lastAck;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是我在复制代码时打错的。我只需要按照@KevinO 的建议添加 volatile 关键字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多