循环执行3次java

时间:2014-11-18 14:45:53

标签: java loops

嗨我无法理解为什么这个循环在一秒钟内执行3次。它实际上是下载速度计算代码,它非常简单。它测量在前1秒完成的字节,然后将其添加到列表中,然后取平均列表中的所有项目,然后更新gui,最后它休眠1秒。

private void update() {
    List<Float> list = new ArrayList<>();
    do {
        float averageSpeed = 0;
        // Calculating
        // I have a multiple threads which are downloading this file in segments
        // and all of them increment value of data.bytesDone when ever
        // they download a portion of data so I calculate bytesDone in one sec
        // and then take average of it using a list which contain speed values of
        // previous 20 sec. 
        float speed = (data.bytesDone.get() - currentBytes);
        currentBytes = data.bytesDone.get();

        System.out.println(speed);

        list.add(speed);
        if (list.size() > 20) {
            list.remove(0);
        }
        for (Float increment : list) {
            averageSpeed += increment;
        }
        averageSpeed /= list.size();

        // Updating Gui //

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (data.state.equals(State.ACTIVE) && data.bytesDone.get() != data.sizeOfFile);
}

编辑:伙计们我真的不明白为什么这个循环在一秒钟内打印速度是3次,它应该总是在一秒钟内打印一次。 TY

1 个答案:

答案 0 :(得分:0)

而不是使用Thread.sleep(1000);你可以考虑使用这个位。

在你做完之后{

long startMili = System.currentTimeMillis();

而不是你的整个Thread.sleep(1000)把它放进去。

long currentMili = System.currentTimeMilis();
while(currentMili - startMili < 1000){
    long currentMili = System.currentTimeMilis();
} 

这将确保此代码每秒循环1次。

如果这不能解决问题,那么您可能会遇到某种线程问题,因为您使用的是GUI。你怎么称呼更新?是否只有一个线程使用update()。