Потоки Java с пользовательским интерфейсом Swing - PullRequest
2 голосов
/ 18 апреля 2011

После некоторых проблем с настройкой потока для запуска моего MIDI-секвенсора я решил просто удалить его, хотя это замедлит мой пользовательский интерфейс, и я смогу использовать его правильно.

Однако я заметилбыло то, что даже во время игры в Sequencer пользовательский интерфейс был очень активным, даже если он играл около 500 нот, пользовательский интерфейс работал отлично.

Теперь я знаю, что в C #, если вы делаете что-то интенсивное, желательнозагрузите его в новый поток, поскольку он освободит пользовательский интерфейс.Это тот же принцип в Java, это действительно смутило меня.Если это так, может кто-нибудь объяснить, как пользовательский интерфейс не блокируется?

Спасибо

Редактировать:

Следующий код фактически воспроизводит последовательность

public static boolean Play() {
    if(!_sequencer.isRunning()) {
        try {
            _sequencer.setSequence(_sequence);
            _sequencer.start();

            return true;
        } catch (Exception e) {
            Logger.Add(e.getMessage());
        }
    }
    return false;
    //Already running
}

Ответы [ 4 ]

7 голосов
/ 18 апреля 2011

Да, это та же теория. Только поток событий может изменять пользовательский интерфейс, и поэтому, если вы что-то делаете в этом потоке, вы запрещаете другим событиям работать в пользовательском интерфейсе.

Может быть проще представить поток событий как очередь:

  1. Показать форму
  2. Нажмите кнопку
  3. Делай свою работу (Action)
  4. Сброс фокуса кнопки
  5. Обновить индикатор выполнения
  6. и так далее

Если # 3 занимает много времени, это может означать, что ваша форма будет выглядеть заблокированной. Очевидно, это полностью зависит от вашего определения long. В общем случае лучше работать с потоком событий, чем с ним.

2 голосов
/ 18 апреля 2011

Если ваше приложение имеет графический интерфейс пользователя, рекомендуется выполнять дорогостоящие вычисления для нового потока, чтобы предотвратить зависание графики. Вы можете создать SwingWorker или использовать идиому Callable / Future .


2 голосов
/ 18 апреля 2011

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

1 голос
/ 18 апреля 2011

Да, вы правы.Прочитайте Threads и Swing для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...