GUI не работает при запуске синхронизированного метода - PullRequest
0 голосов
/ 31 июля 2011

У меня есть приложение с основным объектом (содержащим Swing GUI) и поддерживающим потоком, который вызывает метод handle () объекта.

Я заметил, что когда метод handle () синхронизируется,в то время как поток использует метод handle (), графический интерфейс основного объекта не отвечает.Код:

public synchronized void handle()){
//method code
}

Я удаляю синхронизированное ключевое слово из handle (), графический интерфейс отзывчив, даже когда поток использует метод handle ().

Интересно отметить, чтокогда я использовал другой объект в качестве блокировки, графический интерфейс снова становится отзывчивым, когда поток использует метод handle ().Код:

public void handle(){
    synchronized(anotherObj){
    //method code
    }
}

Это говорит о том, что Swing GUI использует синхронизированные методы.Я прав?Не стесняйтесь указывать мне на любые ресурсы - не могу найти то, что я хотел.

Спасибо.

1 Ответ

2 голосов
/ 31 июля 2011

Каков ваш метод обработки и что он делает?Я полагаю, что Swing по большей части не использует синхронизацию, и его документация фактически заявляет в своем API, что он не является поточно-ориентированным (например, посмотрите здесь ).Вместо этого он использует один поток для взаимодействия с пользователем и рисования программы, EDT или Поток диспетчеризации событий , и все программы, взаимодействующие с Swing, должны уважать эту модель одного потока, вызывая большинство всех вызовов Swing в EDT.Я подозреваю, что это где ваша проблема.

Подробнее о многопоточности Swing и использовании фоновых потоков см. Здесь: Параллельность в Swing

Редактировать 1
(Из моего комментария) Я должен также спросить, почему этот метод синхронизирован?Поскольку мы помещаем все вызовы Swing в очередь событий, это, вероятно, не является необходимым и может быть вреднымЗамораживание программы Swing почти всегда происходит из-за проблемы параллелизма, поэтому это обсуждение актуально.

Возможно, вы захотите создать небольшую скомпилируемую тестовую программу ( SSCCE ), которая демонстрирует вашу проблему (зависание графического интерфейса пользователя), и опубликуйте ее здесь, чтобы мы могли проверить ее самостоятельно.

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