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

时间:2016-09-18 00:21:54

标签: java loops timer java-threads

My 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。

1 个答案:

答案 0 :(得分:0)

你的SimpleTimer与其他人在同一个线程中工作,所以当你调用st.start()时会发生什么事情直接在那里执行所有事情,然后执行其余的测试。您需要将所有SimpleTimer逻辑放在run方法而不是start方法中并完全删除start方法,Thread类已经以正确的方式实现了它(但保持对{的调用{1}},没关系,这就是你如何开始一个新的线程)。但即便如此,它也不会按预期工作,但这实际上是并发问题,而不是错误。我的意思是,由于延迟,它有可能会有效(仅有时,并非总是如此),但依赖延迟,它并不是一个好主意。