2016-03-30 7 views
0

スレッドを実行しているので、laskAck変数が更新されています。タイムアウトを意図的に非常に大きく設定しているので、スレッドにlaskAck変数を更新する機会があります。私は私のコードをデバッグし、ステップバイステップで動作しますが、私はそれを正常に実行すると、プログラムは(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

ありがとうございました!!!これに1時間こだわった! – amoh

答えて

1

別のスレッドによって更新されている変数があるため、スレッドの安全性をサポートする方法で変数を宣言する必要があります。 1つの方法は、volatileキーワードを使用することです。他のアプローチには、おそらくjava.util.concurrentパッケージからのタイプの使用が含まれます。ここでは、特定の場合には

は、変数 lastAckのように宣言されていることを確認してください。

volatile long lastAck;

とループチェックは、常にそれをキャッシュするのではなく、メモリから値を引っ張ってきます。

0

Javaは大文字と小文字が区別されるので、timeouttimeOutと同じではありません。条件をtimePassed > timeoutに変更する必要があります。

+0

私はコードをコピーしていたときにそれはタイプミスです。 @KevinOが示唆しているように、volatileキーワードを追加するだけでした – amoh