2016-09-18 3 views
0

My TESTは、スレッドを1秒遅らせるために、1000秒をミリ秒単位で持つSimpleTimerのインスタンスを作成します。スレッドに関する問題。スレッドを利用するタイマーをテストしようとしていて、ループ内でスタックしているようです。

@Test 
public void testSimpleTimerAsThread() throws InterruptedException 
{ 
    SimpleTimer st = new SimpleTimer(1000); 
    st.start(); 
    Thread.sleep(250); 
    for(int x = 0; x<5; x++) 
    { 
     assertEquals(x, st.getRound()); 
     Thread.sleep(1000); 
    } 
} 

マイMETHOD

timeChanged()だけのラウンド数を更新し、すべての観察者が自分の時間を更新するために呼び出します。

public void start() 
{ 
    for(int r = 0; r<5; r++) 
    { 
     try 
     { 
      timeChanged(); 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
     } 
    } 
} 

SimpleTimerはスレッドを拡張し、このコードを実際に混乱させないインターフェイスを実装します。

私はこれを実行すると、私はそれが0を期待したが5はそうインクリメント決してxとラウンドが他の部分と同じスレッドで5

+0

最初のassertが等しい場合はx = 0とround = 5なので、assertは失敗します。 – Pat

+0

round = 5 timeChanged(){round + 1} – Pat

答えて

0

あなたSimpleTimer作品に増加し、そのときにされたと言ってJavaのアサーションエラーを取得しますst.start()を呼び出すと、そこはまっすぐに進み、すべてが実行され、残りのテストが実行されます。あなたのSimpleTimerロジックをstartメソッドの代わりにrunメソッドに置き、startメソッドを完全に削除する必要があります。スレッドクラスは既に正しい方法で実装されています(ただし、st.start()を呼び出してください。 。しかし、それでも期待通りには動作しませんが、実際には同時実行性の問題であり、間違いではありません。遅延のために(時には、必ずしもそうではない)うまくいく可能性はわずかですが、遅延に頼っているのは本当に良い考えではありません。

+0

が実装されています。あなたの知識と助けてくれてありがとう。 – abcdabcdefef

関連する問題