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