Я не уверен, что вам действительно нужен цикл while в GUI.Можете ли вы настроить графический интерфейс для получения сообщений?Например, когда MIDI-файл заканчивается, если это важная информация, попросите прослушиватель MIDI-файла отправить любое желаемое сообщение на панель GUI, возможно, вместе с update или repaint ().
Для SourceDataLineвоспроизведения, есть LineListener, который может быть активирован в конце воспроизведения.Я почти уверен, что есть что-то подобное и для воспроизведения MIDI.
[Редактировать: осматривать учебник, http://docs.oracle.com/javase/tutorial/sound/MIDI-seq-adv.html, есть раздел «Указание прослушивателей специальных событий», который может быть полезен.]
Если я хочу приостановить поток, мой первый выбор - Thread.sleep ().Можно отправить прерывание команде сна, если вам нужно выйти из него раньше, чем вы выбрали.Точность команды сна ограничена прерыванием системных часов, а в некоторых ОС Microsoft может быть отключено до 15 мсек - это единственный недостаток.Настройка «пробуждения по вызову» от таймера имеет такое же ограничение точности синхронизации.
Если вы включаете активность, чтобы убить время, вы, вероятно, потребляете циклы ЦП без необходимости, потенциально замедляя остальную часть вашей программы.
Не могу сказать, что полностью понимаю вашу настройку после попытки прочитать ваш вопрос, и я надеюсь, что это, по крайней мере, несколько полезно!