嗨我无法理解为什么这个循环在一秒钟内执行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
答案 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()。