我想让我的用户了解 I/O 操作的进度。目前我有一个内部类,我在开始 I/O 之前启动它并在它完成后停止。它看起来像这样:
class ProgressUpdater implements Runnable {
private Thread thread;
private long last = 0;
private boolean update = true;
private long size;
public ProgressUpdater(long size) {
this.size = size;
thread = new Thread(this);
}
@Override
public void run() {
while (update) {
if (position > last) {
last = position;
double progress = (double) position / (double) size * 100d;
parent.setProgress((int) progress);
}
}
}
public void start() {
thread.start();
}
public void stop() {
update = false;
parent.setProgress(100);
}
}
parent
是我对我的 UI 的引用,position
是我外部类中的一个字段,表示我们在 I/O 中取得的进展。停止时我将进度设置为 100%,因为有时 I/O 完成并停止我的更新程序,然后才能完成对先前增量的更新。这只是确保它是 100%。
目前,这有效,我像这样使用它:
ProgressUpdater updater = new ProgressUpdater(file.length());
updater.start();
//do I/O
//...
updater.stop();
问题是循环非常严重地消耗 CPU。我尝试在那里扔一个锁(带有等待/通知),但我不知道在使用等待/通知时我在做什么,所以它只是挂起了我的线程。我能做些什么来阻止它使用这么多 CPU 周期?