Одним из шаблонов проектирования, который здесь может быть полезен, является шаблон слушателя. Зарегистрируйте обработчик прогресса в рабочем потоке. Затем слушатель отвечает за публикацию в GUI (или что-то еще, что может быть заинтересовано в прогрессе).
Поскольку в подобной ситуации крайне маловероятно, что у вас будет несколько слушателей, часто лучше просто иметь одного слушателя (уменьшает сложность и накладные расходы).
В моих приложениях длительные операции вызываются передачей ProgressTracker (который имеет два типа событий: процент и текст состояния). Эта информация используется для обновления JProgressBar, JLabel, чего угодно ... Я также использую ProgressTracker для проверки необходимости отмены операции.
SwingWorker действительно имеет некоторый код, который помогает объединять несколько обновлений, но он основан на предположении, что долго выполняющиеся задачи должны наследоваться от SwingWorker, что не помогает разделить проблемы. Вам решать, в каком направлении двигаться - лично я предпочитаю, чтобы операции с моими данными не имели никакого отношения к GUI.
Не забудьте публиковать обновления для любых компонентов Swing в EDT с помощью SwingUtilities.invokeLater ()