2016-03-30 33 views
0

我有一個線程運行,不斷更新我的laskAck變量。我將目標設定爲非常大,以便我的線程有機會更新laskAck變量。當我調試我的代碼並逐步運行時,它可以正常運行,但如果我正常運行它,程序將暫停在if(timePassed> timeOut)。任何想法爲什麼發生這種情況我陷入了for循環無緣無故使用定時器

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; 
      } 
     } 
+0

你調查了'volatile'關鍵字嗎?你可能會看[這個問題](http://stackoverflow.com/questions/7369742/why-doesnt-this-java-loop-in-a-thread-work?rq=1) – KevinO

+0

Thankyouu !!!一直堅持了一個小時! – amoh

回答

1

由於有一個變量正在被另一個線程更新,因此必須以支持線程安全的方式聲明該變量。一種方法是使用volatile關鍵字。其他方法可能包括使用java.util.concurrent包中的類型。

在這裏的特殊情況下,確保變量lastAck聲明爲:

volatile long lastAck;

,循環檢查總會拉從內存中的價值,而不是將其高速緩存。

0

Java是大小寫敏感的,所以timeout是不一樣的timeOut。您需要將條件更改爲timePassed > timeout

+0

這是我在複製代碼時的拼寫錯誤。我只需要添加易揮發的關鍵​​字@KevinO建議 – amoh