线程问题。尝试测试一个使用线程的计时器,但似乎陷入了循环
Issues with Threads. Trying to test a timer that utilizes threads and seem to get stuck in a loop
我的 TEST 创建了一个 SimpleTimer 实例,以 1000 作为毫秒测量值,以将线程延迟 1 秒。
@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);
}
}
我的方法
timeChanged() 只是更新轮数并要求所有观察者更新他们的时间。
public void start()
{
for(int r = 0; r<5; r++)
{
try
{
timeChanged();
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
}
}
SimpleTimer 扩展了 Thread 并实现了一个不会真正混淆此代码的接口。
当我 运行 这个时,我得到 java 断言错误,说它预期为 0 但实际为 5 所以 x 从未递增并且轮数增加了 5.
您的 SimpleTimer
与其他线程在同一个线程中工作,因此当您调用 st.start()
时,它会直接执行所有操作,然后执行其余测试。您需要将所有 SimpleTimer
逻辑放在 run
方法而不是 start
方法中,并完全删除 start 方法,Thread class 已经以正确的方式实现了它(但是继续调用 st.start()
,没关系,这就是你开始新线程的方式)。但即便如此,它也不会按预期工作,但这实际上是并发问题,而不是错误。我的意思是,由于延迟,它有可能会起作用(只是有时,并非总是如此),但依赖于延迟并不是一个好主意。
我的 TEST 创建了一个 SimpleTimer 实例,以 1000 作为毫秒测量值,以将线程延迟 1 秒。
@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);
}
}
我的方法
timeChanged() 只是更新轮数并要求所有观察者更新他们的时间。
public void start()
{
for(int r = 0; r<5; r++)
{
try
{
timeChanged();
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
}
}
SimpleTimer 扩展了 Thread 并实现了一个不会真正混淆此代码的接口。
当我 运行 这个时,我得到 java 断言错误,说它预期为 0 但实际为 5 所以 x 从未递增并且轮数增加了 5.
您的 SimpleTimer
与其他线程在同一个线程中工作,因此当您调用 st.start()
时,它会直接执行所有操作,然后执行其余测试。您需要将所有 SimpleTimer
逻辑放在 run
方法而不是 start
方法中,并完全删除 start 方法,Thread class 已经以正确的方式实现了它(但是继续调用 st.start()
,没关系,这就是你开始新线程的方式)。但即便如此,它也不会按预期工作,但这实际上是并发问题,而不是错误。我的意思是,由于延迟,它有可能会起作用(只是有时,并非总是如此),但依赖于延迟并不是一个好主意。