线程问题。尝试测试一个使用线程的计时器,但似乎陷入了循环

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(),没关系,这就是你开始新线程的方式)。但即便如此,它也不会按预期工作,但这实际上是并发问题,而不是错误。我的意思是,由于延迟,它有可能会起作用(只是有时,并非总是如此),但依赖于延迟并不是一个好主意。