Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Thread.Sleep() зависает

Автор вопроса: user1357159Ответов: 3

Вот фрагмент

kit.insertHTML(doc, doc.getLength(), "Hello", 0, 0, null);
try{
Thread.sleep(1000);
}catch(Exception e){}

Я использую HTMLEditorKit() и HTMLDocument() в качестве текстового поля. В текстовом поле должно отображаться "Привет", затем подождать одну секунду, однако, когда я пытаюсь это сделать, оно ждет одну секунду, а затем помещает слово "Привет", чего я не хочу.

Я не уверен, почему это происходит, потому что я поставил это в логическом порядке. Если кто-нибудь может помочь мне с этим, это было бы здорово.

РЕДАКТИРОВАТЬ:

Кто-нибудь знает альтернативу, чтобы я мог использовать эффект "задержки"?

  • Опять же, используйте Swing Timer. Смотрите ссылку в моем ответе. Hovercraft Full Of Eels 21.05.2012

appletjava

Ответы

Ответ 1 · рейтинг 6 · Hovercraft Full Of Eels

Никогда не вызывайте Thread.sleep(...) из потока событий Swing, так как это приведет к тому, что сам поток событий будет спать. Поскольку этот поток отвечает за рисование Swing и взаимодействие с пользователем, это переведет ваше приложение в спящий режим.

Если вам нужна только задержка отображения, рассмотрите возможность использования Swing Таймер.

Если, с другой стороны, ваш поток событий скомпрометирован длительной задачей, выполните задачу в фоновом режиме, используя SwingWorker (как предложил ему Гийом 1+).

Ответ 2 · рейтинг 3 · Guillaume Polet

Вы вызываете sleep в EDT (поток диспетчеризации событий). Вам следует избегать этой ситуации, так как она действительно замораживает пользовательский интерфейс.

Чтобы избежать этой ситуации, используйте SwingWorker. вместо этого или как предложено HFOE, используйте Swing Timer

Ответ 3 · Extreme Coders

Thread.sleep - это длительная задача. Когда вы запускаете такую ​​задачу в EDT, она блокирует выполнение всех запросов на перерисовку. Все ожидающие обработки запросы на перерисовку, которые были отправлены на этапе ожидания, ставятся в очередь для будущей обработки.

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

Чтобы исправить ситуацию, используйте SwingTimer, который срабатывает периодически через определенные промежутки времени, или SwingWorker.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы