Обновление индикатора выполнения с использованием процессора
Я хочу, чтобы мой пользователь был информирован о ходе операции ввода-вывода. В данный момент у меня есть внутренний класс, который я запускаю, прежде чем начать свой ввод-вывод и остановлюсь после того, как это будет сделано. Это выглядит так:
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
моя ссылка на мой интерфейс иposition
это поле в моем внешнем классе, которое показывает, как далеко мы продвинулись в операциях ввода-вывода. Я устанавливаю прогресс на 100% при остановке, потому что иногда ввод-вывод завершается и останавливает мой апдейтер, прежде чем он сможет завершить обновление предыдущего приращения. Это просто гарантирует, что это на 100%.
На данный момент это работает, и я использую это так:
ProgressUpdater updater = new ProgressUpdater(file.length());
updater.start();
//do I/O
//...
updater.stop();
Проблема в том, что цикл сильно жрет процессор. Я попытался добавить блокировку (с ожиданием / уведомлением), но я не знаю, что я делаю, когда дело доходит до использования ожидания / уведомления, поэтому он просто повесил мой поток. Что я могу сделать, чтобы не использовать столько циклов ЦП?