Обновление индикатора выполнения с использованием процессора

Я хочу, чтобы мой пользователь был информирован о ходе операции ввода-вывода. В данный момент у меня есть внутренний класс, который я запускаю, прежде чем начать свой ввод-вывод и остановлюсь после того, как это будет сделано. Это выглядит так:

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();

Проблема в том, что цикл сильно жрет процессор. Я попытался добавить блокировку (с ожиданием / уведомлением), но я не знаю, что я делаю, когда дело доходит до использования ожидания / уведомления, поэтому он просто повесил мой поток. Что я могу сделать, чтобы не использовать столько циклов ЦП?

Ответы на вопрос(2)

Ваш ответ на вопрос